Functor / Applicative / Monad
code: functor.hs
class Functor f where
fmap :: (a -> b) -> f a -> f b
-- 関手則
-- fmap id = id
-- fmap (g . h) = fmap g . fmap h
データ構造の中の各要素に関数を適用していくという考え方の抽象化
code: applicative.hs
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
-- アプリカティブ則
-- pure id <*> x = x
-- pure (g x) = pure g <*> pure x
-- x <*> pure y = pure (\g -> g y) <*> x
-- x <*> (y <*> z) = pure (.) <*> x <*> y
複数の引数をとれるような関手の抽象化
code: monad.hs
class Applicative m => Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
return = pure
-- モナド則
-- return x >>= f = f x
-- mx >>= return = mx
-- (mx >>= f) >>= g = mx >>= (\x -> (f x >>= g))