IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

Applicativeの使い方

Functor: コンテキスト中で1パラメータの関数を適用する。 (a -> b) -> f a -> f b  

Applicative: コンテキスト中で2パラメータの関数を適用する。(実際はFunctorと一緒に使う) (a -> b -> c) -> f a -> f b -> f c  

 > :t (<$>)
(<$>) :: Functor f => (a -> b) -> f a -> f b -- (a -> b)は1パラメータの関数
 > :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
 > 

Functorのbをb -> cに置き換える。Applicativeのaをb、bをcに置き換える。<$>と<*>をならべてみると、f(b -> c)がキャンセルできることがわかる。

(<$>) :: (a -> (b -> c)) -> f a -> f (b -> c)  -- (a -> b -> c)は2パラメータの関数
(<*>) ::                           f (b -> c) -> f b -> f c

<$>と<*>を適用し、その結果の型を書く

         (a -> b -> c) <$> f a                       :: f (b -> c) 
                                  f (b -> c) <*> f b :: f c

f (b->c)をキャンセルする。

         (a -> b -> c) <$> f a               <*> f b :: f c

整理する。

         (a -> b -> c) <$> f a <*> f b :: f c

確認する。

 > :t \g x y -> g <$> x <*> y
\g x y -> g <$> x <*> y  :: Applicative f => (a1 -> a2 -> b) -> f a1 -> f a2 -> f b
 >

余談

Fanctorを1個、ApplicativeをN個とかんがえると、Lensが1個だけ、Traversalが0~N個となることが何となくイメージできる。

type Traversal' a b = forall f . Applicative f => (b -> f b) -> (a -> f a)

type Lens'      a b = forall f . Functor     f => (b -> f b) -> (a -> f a)