更改

添加1,209字节 、 2021年7月11日 (日) 03:21
建立内容为“Category:Haskell == 关系 == <code>Monad</code> 是 <code>Applicative</code> 的 superclass,<code>Applicative</code> 是 <code>Functor</code> 的 supercla…”的新页面
[[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>(&lt;*&gt;)</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>(&lt;*&gt;)</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>