Sunday, 17 June 2018

Applicative

まだ、ちょっと復習していたんですが、なんか作り方がわかった気がする。

  (<*>) T ( a -> b ) -> T a -> T b

だから、

data T a = A (T a) | B (T a) | C a

とかだったら、 T ( a -> b )を場合分けしてやると、

A x <*> y = ?
B x <*> y = ?
C x <*> y = ?

とかになって、A x の x は x : T(a -> b) だから、A ( x <*> y ) みたいな再帰的に定義できるらしい。

こうすると、fmap や >>= と同じような再帰的な定義になるし、「Applicativeは効率良い」ってのもなんかわかりました。

で、C x の x は x : a -> b で同じようにはできないんですが、

pure x = C x

だから、

C x <*> y = pure x <*> y = fmap x y

になるらしいです。こっちは、Functor のuniqunessから出るらしい。

  test2 :: Monad m => m ( Char -> Char -> [ Char ] )
  test2 = return ( \ x y -> [x] ++ [y] )

  testapp = test2 <*> getChar <*> getChar

とかするためのものだというのも、やっと納得できた。

No comments: