应用程序:vs. pure和

问题描述 投票:1回答:1

经过一段时间的示例,对我来说,在使用Control.Applicative类型类时,看起来myFunction <$>pure myFunction <*>是等效的。

示例:

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

均为产量Just "foobar"

这些确实等效吗?还是我忽略了一个极端情况?我更喜欢/更常用哪个变体?尽管pure方法更长,但对Control.Applicative印刷类来说,它看起来更通用和真实。

haskell applicative
1个回答
3
投票

这需要等效。实际上,在Applicative typeclass的文档中,我们阅读:

由于这些法律,ApplicativeFunctor实例将满足

f

由于fmap f x = pure f <*> x 是一个:

(<$>) :: Functor f => (a -> b) -> f a -> f b的中缀同义词。

因此,它认为:

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

因此可以使用两者实现相同的目标。但是,由于fmap较短,并且可能更快(由于[C​​0]需要处理所有f <$> x = pure f <*> x ,因此,建议使用f <$> x)。此外,作为(<*>)f a的默认实现为(<$>),因此它也使用@chepner says(因此也为liftA2)。

© www.soinside.com 2019 - 2024. All rights reserved.