“Functor, Applicative 和 Monad”的版本间的差异
跳到导航
跳到搜索
(建立内容为“Category:Haskell == 关系 == <code>Monad</code> 是 <code>Applicative</code> 的 superclass,<code>Applicative</code> 是 <code>Functor</code> 的 supercla…”的新页面) |
|||
第28行: | 第28行: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | 但由于 <code>return</code> 是 <code>Monad</code> 版本的 <code>pure</code>,<code>ap</code> 是 <code>Monad</code> 版本的 <code>(<*>)</code>,为了方便也可如下实现 | + | 但由于 <code>return</code> 是 <code>Monad</code> 版本的 <code>pure</code>,<code>ap</code> 是 <code>Monad</code> 版本的 <code>(<*>)</code>,为了方便也可如下实现<ref>[[wikibooks:Haskell/Understanding_monads#liftM_and_Friends]]</ref> |
<syntaxhighlight lang=haskell> | <syntaxhighlight lang=haskell> | ||
第42行: | 第42行: | ||
fmap = liftM | fmap = liftM | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | == 参考资料 == | ||
+ | |||
+ | <references /> |
2021年7月11日 (日) 03:23的版本
关系
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
版本的 (<*>)
,为了方便也可如下实现[1]
instance Monad Foo where
return = -- etc.
(>>=) = -- etc.
instance Applicative Foo where
pure = return
(<*>) = ap
instance Functor Foo where
fmap = liftM