Haskell 中的 *> 和 >> 有什么区别?

Has*_*san 9 monads haskell applicative

从文档:

(>>) : 依次组合两个动作,丢弃第一个动作产生的任何值

(*>):序列操作,丢弃第一个参数的值。

在我看来,两者都在做同样的工作。

chi*_*chi 10

在实践中,它们是等效的。

从历史上看,Haskell 没有Applicative类型类(因此没有*>),而只有一个Monad类型类(带有>>)。

在某一时刻,Applicative被做成了Monad. 那时,它被引入*>为 的一个稍微更通用的变体>>,它不需要与 monad 一起工作,而只需要与应用函子一起工作。

(*>) :: Applicative f => f a -> f b -> f b
(>>) :: Monad f       => f a -> f b -> f b
Run Code Online (Sandbox Code Playgroud)

最终结果是,当使用 applicatives 时,我们只能使用*>,而在使用 monads(也是 applicatives)时,我们可以使用*>>>互换使用,因为在这种情况下它们必须是等效的。

其他几个与 monad 相关的函数也被类似地推广到 applicatives:

  • return 概括为 pure
  • ap 概括为 <*>
  • mapM 概括为 traverse

  • 一个小修正:`*&gt;` 运算符在成为 `Monad` 的超类之前是 `Applicative` 的一部分(请参阅 [base-4.7.0.0](https://hackage.haskell.org/package/base-4.7 .0.0/docs/Control-Applicative.html))。所以,历史是:(1)Haskell 只有 `Monad` 和 `&gt;&gt;`;(2) `Applicative` 引入相应的 `*&gt;` 运算符;(3) `Applicative` 成为 `Monad` 的超类,之后它们在实践中是等价的。 (3认同)