我正在学习Haskell的Applicatives。在我看来(我可能错了),实际上并不需要pure函数,例如:

pure (+) <*> [1,2,3] <*> [3,4,5]

可以写成
(+) <$> [1,2,3] <*> [3,4,5]

有人可以解释pure函数提供的优于fmap的显式映射的好处吗?

最佳答案

我现在的能力很强,因此不要花太多时间,但发表评论的时间太长了。

在类型类中包括pure可能有实际原因,但是许多Haskell抽象是从理论基础上派生的,我相信Applicative也是这种情况。正如文档所述,它是一个强大的松散单曲面仿函数(有关详细信息,请参见https://cstheory.stackexchange.com/q/12412/56098)。我猜想pure充当身份,就像return充当Monad(这是endofunctors类别中的一个monoid)一样。

考虑pureliftA2:

pure :: a -> f a
liftA2 :: (a -> b -> c) -> f a -> f b -> f c

如果稍微斜视一下,您也许可以想象liftA2是二进制操作,这也是文档指出的内容:

将二进制函数提升为动作。
pure是相应的标识。

关于haskell - 对纯净性的需求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60275047/

10-12 06:16