我正在学习Haskell的Applicatives。在我看来(我可能错了),实际上并不需要纯函数,例如:
pure (+) <*> [1,2,3] <*> [3,4,5]
可以写成
(+) <$> [1,2,3] <*> [3,4,5]
有人能解释纯函数提供的优于使用fmap的显式映射的好处吗?
fmap
并不总是将其剪切。具体来说,pure
是让您在没有f
的情况下(其中f
为Applicative
)的方法。一个很好的例子是
sequence :: Applicative f => [f a] -> f [a]
[它包含产生值的“动作”列表,并将其转变为产生值列表的动作。如果列表中没有动作,会发生什么?唯一合理的结果是不产生任何值的动作:
sequence [] = pure [] -- no way to express this with an fmap
-- for completeness
sequence ((:) x xs) = (:) <$> x <*> sequence xs
如果没有pure
,将被迫要求提供非空的动作列表。您绝对可以使它起作用,但这就像在不使用0的情况下进行算术运算(这不是巧合!)。您将反复遇到用pure
可以轻松解决的极端情况,但必须通过对输入和其他创可贴的怪异限制来解决。