あどけない話 / QAで学ぶMonadを読んでいます。(2)
>:m Control.Applicative > :t (<*>) (<*>) :: (Applicative f) => f (a -> b) -> f a -> f b > :t (<$>) (<$>) :: (Functor f) => (a -> b) -> f a -> f b -- (<$>) は Functor のインスタンス a に対して (a -> b) の関数を適用 -- し、Functor のインスタンス b を返す > (<$>) (+1) (Just 1) -- => Just 2 > (+1) <$> Just 1 -- => Just 2 > (+) <$> return 1 <*> return 2 -- => 3 > (+) <$> Just 1 <*> Just 2 -- => Just 3 > (+) <$> Just 1 <*> Nothing -- => Nothing
Applicative の <*> を使うと do で書いていた記述がすっきり簡単に書けるようです。
> let add3 a b c = a + b + c > do{a1<-return 1; a2<-return 2; a3<-return 3; return $ add3 a1 a2 a3} -- => 6 > add3 <$> return 1 <*> return 2 <*> return 3 -- => 6
「pure と return は同一視できる」と言う記述があるのでやってみると・・・。
> add3 <$> pure 1 <*> pure 2 <*> pure 3 -- => 6 > :t pure 1 pure 1 :: (Num t, Applicative f) => f t > :t return 1 return 1 :: (Num t, Monad m) => m t
分かってません・・・Orz