关系
Monad
是 Applicative
的 superclass,Applicative
是 Functor
的 superclass。
相关函数的关系
对于一个 Monad
:
liftM
与fmap
可互换ap
与(<*>)
可互换return
与pure
可互换
运用
需要给一个类型实现 Monad
时,应从 Functor
开始实现,再实现 Applicative
和 Monad
。如下
instance Functor Foo where
fmap = -- etc.
instance Applicative Foo where
pure = -- etc.
(<*>) = -- etc.
instance Monad Foo where
(>>=) = -- etc.
但由于 return
是 Monad
版本的 pure
,ap
是 Monad
版本的 (<*>)
,为了方便也可如下实现[1]
instance Monad Foo where
return = -- etc.
(>>=) = -- etc.
instance Applicative Foo where
pure = return
(<*>) = ap
instance Functor Foo where
fmap = liftM