繁体   English   中英

Sum和Product的Applicative / Monad实例有什么用?

[英]What is the use of Applicative/Monad instances for Sum and Product?

我对SumProduct newtypes的理解是它们作为数字类型的monoidial包装器。 我会理解Functor实例,但为什么还有ApplicativeMonad还有其他许多看似无用的实例? 我知道它们在数学上是可以的(与Identity modad同构,对吧?)但是用例是什么? 例如,如果存在Applicative Sum实例,我希望在某处遇到Sum (a -> b)类型的值。 我无法想象这可能有用的地方。

这样的实例便于提升任意函数以处理当前生活在SumProduct事物。 例如,人们可能会想象想要对Sum比使用更方便的东西做一些按位操作; 然后liftA2 (.&.) :: Sum Int -> Sum Int -> Sum Int (例如)。

也可以通过为Sum提供Bits实例来提供此操作,但是推广该技术将需要Sum的实现者来预测可能想要做的每个操作,这看起来像一个很高的顺序。 提供ApplicativeMonad实例为用户提供一劳永逸的翻译,以提升他们喜欢的任何功能 - 包括Sum的实现者预测不会有用。

像这样的值通常来自二元运算符的部分应用。 假设FunctorApplicative例如

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM