首页 > 解决方案 > 应用程序:<$> vs. pure 和 <*>

问题描述

在尝试了一段时间的示例之后,对我来说,在处理 Control.Applicative 类型类时,它看起来myFunction <$>和等价。pure myFunction <*>

例子:

(++) <$> Just "foo" <*> Just "bar"
pure (++) <*> Just "foo" <*> Just "bar"

两者都产生Just "foobar"

这些确实是等效的还是我忽略了一个边缘情况?我应该更喜欢哪个变体/更常见?虽然pure方法更长,但对我来说,它对 Control.Applicative 类型类看起来更通用和真实。

标签: haskellapplicative

解决方案


这需要是等价的。事实上,在Applicativetypeclass的文档中,我们读到:

作为这些定律的结果,Functor例子 forf将满足

fmap f x = pure f <*> x

由于(<$>) :: Functor f => (a -> b) -> f a -> f b是:

的中缀同义词fmap

因此,它认为:

f <$> x = pure f <*> x

因此,两者可用于实现相同的目的。然而,由于f <$> x它更短,并且可能更快(因为(<*>)需要处理所有f as),因此可能建议使用(<$>))。此外,正如@chepner 所说,默认实现liftA2liftA2 f x = (<*>) (fmap f x),所以它也使用fmap(so <$>)。


推荐阅读