添加1,209字节
、 2021年7月11日 (日) 03:21
[[Category:Haskell]]
== 关系 ==
<code>Monad</code> 是 <code>Applicative</code> 的 superclass,<code>Applicative</code> 是 <code>Functor</code> 的 superclass。
=== 相关函数的关系 ===
对于一个 <code>Monad</code>:
* <code>liftM</code> 与 <code>fmap</code> 可互换
* <code>ap</code> 与 <code>(<*>)</code> 可互换
* <code>return</code> 与 <code>pure</code> 可互换
== 运用 ==
需要给一个类型实现 <code>Monad</code> 时,应从 <code>Functor</code> 开始实现,再实现 <code>Applicative</code> 和 <code>Monad</code>。如下
<syntaxhighlight lang=haskell>
instance Functor Foo where
fmap = -- etc.
instance Applicative Foo where
pure = -- etc.
(<*>) = -- etc.
instance Monad Foo where
(>>=) = -- etc.
</syntaxhighlight>
但由于 <code>return</code> 是 <code>Monad</code> 版本的 <code>pure</code>,<code>ap</code> 是 <code>Monad</code> 版本的 <code>(<*>)</code>,为了方便也可如下实现
<syntaxhighlight lang=haskell>
instance Monad Foo where
return = -- etc.
(>>=) = -- etc.
instance Applicative Foo where
pure = return
(<*>) = ap
instance Functor Foo where
fmap = liftM
</syntaxhighlight>