![](/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.