まだ、ちょっと復習していたんですが、なんか作り方がわかった気がする。
(<*>) 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:
Post a Comment