如何解决Haskell 中的 *> 和 >> 有什么区别?
来自文档:
(>>) :依次组合两个动作,丢弃第一个动作产生的任何值
(*>) :序列操作,丢弃第一个参数的值。
在我看来,两者都在做同样的工作。
解决方法
它们在实践中是等效的。
历史上,Haskell 没有 Applicative
类型类(因此没有 *>
),而只有 Monad
类型类(带有 >>
)。
在某个时刻,Applicative
成为 Monad
的超类。那时,它被引入 *>
作为 >>
的稍微更通用的变体,它不需要一个人使用 monad,而只需要一个应用函子。
(*>) :: Applicative f => f a -> f b -> f b
(>>) :: Monad f => f a -> f b -> f b
最终结果是,当使用 applicatives 时,我们只能使用 *>
,而在使用 monads(也是 applicatives)时,我们可以交替使用 *>
或 >>
,因为在这种情况下它们必须是等效的。
其他几个与 monad 相关的函数也被类似地推广到应用程序:
-
return
由pure
概括
-
ap
由<*>
概括
-
mapM
由traverse
概括
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。