Functor

Functor 可被想象成 Mappable。

Applicative

Monad

相关函数

(>>=): bind

(>>): then 运算符。忽略上一个 Monad 的结果

(>=>): monad 复合,(bs >=> cs) a 可理解为 do { b <- bs a; cs b }

(<=<): flip (>=>),就像 (.) 运算符 1

关系

MonadApplicative 的 superclass,ApplicativeFunctor 的 superclass。

相关函数的关系

对于一个 Monad

  • liftMfmap 可互换
  • ap(<*>) 可互换
  • returnpure 可互换

运用

需要给一个类型实现 Monad 时,应从 Functor 开始实现,再实现 ApplicativeMonad。如下

instance Functor Foo where
    fmap = -- etc.
 
instance Applicative Foo where
    pure = -- etc.
    (<*>) = -- etc.
 
instance Monad Foo where
    (>>=) = -- etc.

但由于 returnMonad 版本的 pureapMonad 版本的 (<*>),为了方便也可如下实现 2

instance Monad Foo where
    return = -- etc.
    (>>=) = -- etc.
 
instance Applicative Foo where
    pure = return
    (<*>) = ap
 
instance Functor Foo where
    fmap = liftM

Footnotes

  1. wikibooks:Haskell/Understanding_monads#Monadic_composition

  2. wikibooks:Haskell/Understanding_monads#liftM_and_Friends