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)