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

What is the difference between *> and >> in Haskell?

来自文档:

(>>) :依次组合两个动作,丢弃第一个

产生的任何值

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

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

它们实际上是等价的。

历史上,Haskell 没有 Applicative 类型类(因此没有 *>),只有 Monad 类型类(有 >>)。

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

(*>) :: Applicative f => f a -> f b -> f b
(>>) :: Monad f       => f a -> f b -> f b

最终结果是,在使用应用程序时,我们只能使用 *>,而在使用 monad(也是应用程序)时,我们可以使用 *>>> 可以互换,因为在那种情况下它们必须是等价的。

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

  • returnpure
  • 概括
  • ap<*>
  • 概括
  • mapMtraverse
  • 概括