簡體   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