Control.Applicative の を使ってみる

あどけない話 / 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