“Functor, Applicative 和 Monad”的版本间的差异

来自wrc's Wiki
跳到导航 跳到搜索
(建立内容为“Category:Haskell == 关系 == <code>Monad</code> 是 <code>Applicative</code> 的 superclass,<code>Applicative</code> 是 <code>Functor</code> 的 supercla…”的新页面)
 
 
(未显示同一用户的2个中间版本)
第1行: 第1行:
 
[[Category:Haskell]]
 
[[Category:Haskell]]
 +
== Functor ==
 +
 +
<code>Functor</code> 可被想象成 Mappable。
 +
 +
== Applicative ==
 +
 +
== Monad ==
 +
 +
=== 相关函数 ===
 +
 +
;<code>(&gt;&gt;=)</code>: bind
 +
;<code>(&gt;&gt;)</code>: then 运算符。忽略上一个 Monad 的结果
 +
;<code>(&gt;=&gt;)</code>: monad 复合,<code>(bs &gt;=&gt; cs) a</code> 可理解为 {{code|haskell|do { b <- bs a; cs b }<nowiki/>}}
 +
;<code>(&lt;=&lt;)</code>: <code>flip (&gt;=&gt;)</code>,就像 <code>(.)</code> 运算符<ref>[[wikibooks:Haskell/Understanding_monads#Monadic_composition]]</ref>
 +
 
== 关系 ==
 
== 关系 ==
  
第28行: 第43行:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
但由于 <code>return</code> 是 <code>Monad</code> 版本的 <code>pure</code>,<code>ap</code> 是 <code>Monad</code> 版本的 <code>(&lt;*&gt;)</code>,为了方便也可如下实现
+
但由于 <code>return</code> 是 <code>Monad</code> 版本的 <code>pure</code>,<code>ap</code> 是 <code>Monad</code> 版本的 <code>(&lt;*&gt;)</code>,为了方便也可如下实现<ref>[[wikibooks:Haskell/Understanding_monads#liftM_and_Friends]]</ref>
  
 
<syntaxhighlight lang=haskell>
 
<syntaxhighlight lang=haskell>
第42行: 第57行:
 
     fmap = liftM
 
     fmap = liftM
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
== 参考资料 ==
 +
 +
<references />

2021年7月11日 (日) 04:46的最新版本

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

参考资料