Functor
Functor 可被想象成 Mappable。
Applicative
Monad
相关函数
(>>=): bind
(>>): then 运算符。忽略上一个 Monad 的结果
(>=>): monad 复合,(bs >=> cs) a 可理解为 do { b <- bs a; cs b }
(<=<): flip (>=>),就像 (.) 运算符 1
关系
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 版本的 (<*>),为了方便也可如下实现 2
instance Monad Foo where
return = -- etc.
(>>=) = -- etc.
instance Applicative Foo where
pure = return
(<*>) = ap
instance Functor Foo where
fmap = liftM