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

标签 haskell monads applicative

从文档:
(>>) :依次组合两个 Action ,丢弃第一个 Action 产生的任何值
(*>) : 序列 Action ,丢弃第一个参数的值。
在我看来,两者都在做同样的工作。

最佳答案

在实践中,它们是等效的。
从历史上看,Haskell 没有 Applicative类型类(因此没有 *> ),但只有 Monad类型类(带有 >> )。
在某个时刻,Applicative成为 Monad 的父类(super class).那时,它被介绍了*>作为 >> 的更一般的变体,它不需要使用 monad,而只需要使用 applicative functor。

(*>) :: Applicative f => f a -> f b -> f b
(>>) :: Monad f       => f a -> f b -> f b
最终结果是,在使用应用程序时,我们只能使用 *> ,而在使用 monads(也是应用程序)时,我们可以使用 *>>>可以互换,因为在这种情况下它们必须是等价的。
其他几个与 monad 相关的函数也被类似地推广到应用程序:
  • returnpure 概括
  • ap<*> 概括
  • mapMtraverse 概括
  • 关于haskell - Haskell中的*>和>>有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66884809/

    相关文章:

    haskell - fmap和bind之间的能力差异?

    haskell - 编写函数 (a -> b -> ... -> t) -> (Monad m => m a -> m b -> ... -> m t)

    haskell - LYHFGG : "Monads are just applicative functors that support >>=". 这个说法在什么意义上是正确的?

    haskell - 你如何构图_Just with the at lens

    haskell - 如何在 Haskell 中将资源编译为二进制文件?

    list - Haskell - 我如何迭代和比较?

    linux - Haskell 行不会执行 : do { n <- readLn ; print (n^2) }

    javascript - 简单的 Maybe 函数出错

    haskell - `<*>` 和 `<$>` 之间的关系

    haskell - 在 Haskell 中的元组和列表上 Applicative 的不同行为