我對Sum
和Product
newtypes的理解是它們用作數字類型的monoidial包裝。我會明白Functor
實例,但爲什麼還有Applicative
,Monad
其他任何看似無用的實例?我知道他們在數學上沒問題(同構於Identity
modad,對吧?)但是用例是什麼?例如,如果有Applicative Sum
實例,我預計會在某處遇到類型爲Sum (a -> b)
的值。我無法想象這可能會有用。Sum和產品的Applicative/Monad實例的用途是什麼?
回答
這種情況下是便於吊裝任意函數在事情發生到現在住一個Sum
或Product
內工作。例如,人們可能會想像想要對Sum
中的某些內容進行按位操作,而不是裸露;然後liftA2 (.&.) :: Sum Int -> Sum Int -> Sum Int
(例如)。
人們還可以通過給Bits
實例Sum
,但推廣該技術將需要Sum
的實現者來預測人們可能曾經想要做的每一項操作,這似乎是一個艱鉅的任務提供了這種操作。提供Applicative
和Monad
實例爲用戶提供了一次全部翻譯,以提升他們喜歡的任何功能 - 包括Sum
的實施者未預測的有用功能。
是的,但這可以說是濫用'Applicative'類。爲了這個目的,使用['Iso' combinators](http://hackage.haskell.org/package/lens-4.14/docs/Control-Lens-Iso.html)更好。 – leftaroundabout
@leftaroundabout你能否仔細說一下'Iso'組合器更好?天真地說,它們看起來像一個奇怪的折衷:它是一個非常沉重的依賴關係(當然不是應該被放入基地的依賴關係),並且提升兩個或更多參數函數的語法看起來比單個應用「liftA2」更冗長。 –
@leftaroundabout,當我看着'au'和'auf',我的眼睛掠過。 – dfeuer
這樣的值通常由二元運算符的部分應用產生。假設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}
由於'Num'實例,'Sum 5 * Sum 10'也有效。 – chi
- 1. JUnit測試用例中「失敗」的實際用途是什麼?
- 2. 什麼是System.Transactions的實際用途?
- 3. jQuery的實際用途是什麼?
- 4. toContain()的實際用途是什麼?
- 5. 是什麼產品和報價項目
- 6. 什麼是「和 - 產品」數據結構?
- 7. CGContextSaveGState和CGContextRestoreGState的用途是什麼?
- 8. HashMap.Entry.recordAccess和recordRemoval的用途是什麼?
- 9. minOccurs,nillable和restriction的用途是什麼?
- 10. GL_COLOR_BUFFER_BIT和GL_DEPTH_BUFFER_BIT的用途是什麼?
- 11. Content.xml和Fragment.xml的用途是什麼
- 12. `$ .support.ownLast`的用途是什麼?
- 13. TPopupActionBar的用途是什麼?
- 14. _GLOBAL__I_的用途是什麼?
- 15. $ _POST的用途是什麼?
- 16. 「$ this」的用途是什麼?
- 17. CreateSilverlight.js的用途是什麼?
- 18. vertexAttribPointer的用途是什麼?
- 19. RecognizerIntent.DETAILS_META_DATA的用途是什麼?
- 20. Rake的用途是什麼?
- 21. javax.security.auth.callback。*的用途是什麼?
- 22. config.assets.precompile的用途是什麼?
- 23. is_uploaded_file()的用途是什麼?
- 24. archetypeArtifactId的用途是什麼?
- 25. System.Data.SqlClient.SqlParameter.IsNullable的用途是什麼?
- 26. com.sun.org.apache.xpath.internal.operations.String的用途是什麼?
- 27. FXCollections.unmodifiableObservableList的用途是什麼?
- 28. __init__的用途是什麼?
- 29. __cxa_pure_virtual的用途是什麼?
- 30. cURL的用途是什麼?
我同意,這些事例似乎沒有任何意義。明確「因爲我們可以」的情況。 – leftaroundabout
我現在沒有權限訪問GHCi,但是有可能它們可以用來做'x :: Sum Int; x = do {1; 2; 3; 4; 5}'? – bheklilr
@bheklilr它「有效」,並返回'總和5',因爲'總和'是身份單子。 – chi