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 相关的函数也被类似地推广到应用程序:
return
由 pure
概括
ap
由 <*>
概括
mapM
由 traverse
概括
来自文档:
(>>) :依次组合两个动作,丢弃第一个
产生的任何值(*>) :顺序操作,丢弃第一个参数的值。
在我看来两者都在做同样的工作。
它们实际上是等价的。
历史上,Haskell 没有 Applicative
类型类(因此没有 *>
),只有 Monad
类型类(有 >>
)。
在某一时刻,Applicative
成为了 Monad
的超类。那时,它被引入 *>
作为 >>
的一种稍微更通用的变体,它不需要使用 monad,而只需要使用一个应用函子。
(*>) :: Applicative f => f a -> f b -> f b
(>>) :: Monad f => f a -> f b -> f b
最终结果是,在使用应用程序时,我们只能使用 *>
,而在使用 monad(也是应用程序)时,我们可以使用 *>
或 >>
可以互换,因为在那种情况下它们必须是等价的。
其他几个与 monad 相关的函数也被类似地推广到应用程序:
return
由pure
概括
ap
由<*>
概括
mapM
由traverse
概括