经过一段时间的示例,对我来说,在使用Control.Applicative类型类时,看起来myFunction <$>
和pure myFunction <*>
是等效的。
示例:
(++) <$> Just "foo" <*> Just "bar"
pure (++) <*> Just "foo" <*> Just "bar"
均为产量Just "foobar"
。
这些确实等效吗?还是我忽略了一个极端情况?我更喜欢/更常用哪个变体?尽管pure
方法更长,但对Control.Applicative印刷类来说,它看起来更通用和真实。
这需要等效。实际上,在Applicative
typeclass的文档中,我们阅读:
由于这些法律,
Applicative
的Functor
实例将满足f
由于fmap f x = pure f <*> x
是一个:
因此,它认为:
(<$>) :: Functor f => (a -> b) -> f a -> f b
因此可以使用两者实现相同的目标。但是,由于fmap
较短,并且可能更快(由于[C0]需要处理所有f <$> x = pure f <*> x
,因此,建议使用f <$> x
)。此外,作为(<*>)
,f a
的默认实现为(<$>)
,因此它也使用@chepner says(因此也为liftA2
)。