28
A
回答
27
當與Traversable
結合使用時,它非常有用。
getConst . traverse Const :: (Monoid a, Traversable f) => f a -> a
這是將一堆東西組合在一起的一般配方。這是使我確信值得從Monad
分離Applicative
的用例之一。我需要這樣的東西廣義elem
elem :: Eq x => x -> Term x -> Bool
做的發生,檢查通過自由變量的參數化表示一個Traversable Term
。我一直在改變Term
的表示方式,我厭倦了修改一個數十億個遍歷函數,其中一些函數正在進行積累,而不是有效的映射。我很高興找到一個涵蓋兩者的抽象。
6
當您的函數或數據結構適用於所有(Applicative
)Functor
s,並且希望以退化的意義重用它時,它非常有用。這類似於將const
或id
傳遞給賦予任意函數的函數。
Van Laarhoven lenses在任意函子來定義,並使用Const
導出字段存取器(和同樣瑣碎Identity
導出字段更新器)。
Traversable
Traversable
類型,正如pigworker提到的,是另一個例子。
7
正如dave4420提到的,爲Van Laarhoven鏡頭實現訪問器和更新包括Const
仿函數。爲了詳細說明:
{-# LANGUAGE Rank2Types #-}
import Control.Applicative
import Control.Monad.Identity
-- The definition of Van Laarhoven lenses:
type Lens a b = forall f . Functor f => (b -> f b) -> (a -> f a)
-- Getter passes the Const functor to the lens:
get :: Lens a b -> a -> b
get l = getConst . (l Const)
-- Updater passes the Identity functor to the lens:
modify :: Lens a b -> (b -> b) -> (a -> a)
modify l f = runIdentity . l (Identity . f)
set :: Lens a b -> b -> (a -> a)
set l r = modify l (const r)
-- Example: -------------------------------------------
data Person = Person { _name :: String, _age :: Int }
deriving Show
name :: Lens Person String
name f (Person n a) = fmap (\x -> Person x a) (f n)
age :: Lens Person Int
age f (Person n a) = fmap (\x -> Person n x) (f a)
main :: IO()
main = do
let john = Person "John" 34
print $ get age john
print $ set name "Pete" john
2
由於加布裏埃爾·岡薩雷斯指出,常量用於提供吸氣劑,以鏡頭。 http://hackage.haskell.org/package/lens-tutorial-1.0.0/docs/Control-Lens-Tutorial.html。在那裏你只使用Const是一個仿函數。
對於遍歷,您需要完整的Applicative行爲,並且它變成了另一個答案中描述的pigworker。
相關問題
- 1. 爲什麼有時函數返回一個const或const引用
- 2. 爲什麼使用const成員函數?
- 3. 函數頭後的const是什麼?
- 4. 什麼是char * const *?
- 5. 什麼時候應該使用const?
- 6. 什麼時候使用const函數之前,當你不應該
- 7. 「int * const const * b」是什麼意思?
- 8. 爲什麼const有時是函數簽名的一部分?
- 9. static const和const有什麼區別?
- 10. 爲什麼有const和非const訪問?
- 11. 爲什麼要使用const T&而不是const T或T&
- 12. 什麼是const變量?
- 13. 「const類」是什麼意思?
- 14. 什麼是const TAB =^I pascal?
- 15. const是什麼意思?
- 16. 什麼是char * const argv []?
- 17. Scala中的應用函數是什麼?
- 18. int const函數(參數),int函數(const參數)和int函數(參數)const之間的區別是什麼?
- 19. 什麼是子應用程序,處理/
- 20. 爲什麼const有意義?
- 21. 什麼是PHP的each()函數有用?
- 22. 什麼是函數應用程序和調用函數?
- 23. static const char * const和static const char []之間有什麼區別?
- 24. 爲什麼我可以從const方法調用非const成員函數指針?
- 25. 爲什麼Boost.Range range_begin/end free函數爲const和非const引用都重載?
- 26. 爲什麼我應該在函數式編程中使用應用函子?
- 27. C++ const成員函數返回一個const指針..但是返回的指針是什麼類型的const?
- 28. 爲什麼在一個類中需要const函數和非const?
- 29. lambda函數有什麼用?
- 30. 什麼是「因子圖」,它們對於什麼有用?
http://www.soi.city.ac.uk/~ross/papers/Applicative.html第4部分是遍歷技巧的一個很好的參考 – 2012-07-18 18:08:19
'foldMap id'不會產生約束更少的相同結果('可摺疊'而不是'可穿越')? – 2012-08-27 07:01:45
確實,這就是爲什麼'可摺疊'存在。然而,所有'Traversable'都是'Foldable'是非常有用的,上面是'foldMapDefault'的構造。插件:SHE支持'DefaultSuperclassInstances',因此''Traversable'的一切都是默認默認的'Foldable'。 – pigworker 2012-09-06 08:56:21