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