![](/img/trans.png)
[英]To what extent are Applicative/Monad instances uniquely determined?
[英]What is the use of Applicative/Monad instances for Sum and Product?
我对Sum
和Product
newtypes的理解是它们作为数字类型的monoidial包装器。 我会理解Functor
实例,但为什么还有Applicative
, Monad
还有其他许多看似无用的实例? 我知道它们在数学上是可以的(与Identity
modad同构,对吧?)但是用例是什么? 例如,如果存在Applicative Sum
实例,我希望在某处遇到Sum (a -> b)
类型的值。 我无法想象这可能有用的地方。
这样的实例便于提升任意函数以处理当前生活在Sum
或Product
事物。 例如,人们可能会想象想要对Sum
比使用更方便的东西做一些按位操作; 然后liftA2 (.&.) :: Sum Int -> Sum Int -> Sum Int
(例如)。
也可以通过为Sum
提供Bits
实例来提供此操作,但是推广该技术将需要Sum
的实现者来预测可能想要做的每个操作,这看起来像一个很高的顺序。 提供Applicative
和Monad
实例为用户提供一劳永逸的翻译,以提升他们喜欢的任何功能 - 包括Sum
的实现者预测不会有用。
像这样的值通常来自二元运算符的部分应用。 假设Functor
和Applicative
例如
import Control.Applicative
import Data.Monoid
instance Functor Sum where
fmap f (Sum x) = Sum (f x)
instance Applicative Sum where
pure = Sum
(Sum f) <*> (Sum x) = Sum (f x)
那么你可以看到Sum (a -> b)
的值是如何产生的。
> :t (*) <$> (Sum 5)
(*) <$> (Sum 5) :: Num a => Sum (a -> a)
> (*) <$> (Sum 5) <*> (Sum 10)
Sum {getSum = 50}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.