我發現一些容器有一個非常相似的功能集。例如,List,Set,Sequence,Text和Bytestrings。我想知道他們爲什麼不使用一個或多個常見的類型類。爲什麼沒有類型類型的容器類型?
回答
實際上有,請參閱問題Making a single function work on lists, ByteStrings and Texts (and perhaps other similar representations),這幾乎是你的副本。
在一個單獨的包中,主要原因可能是它需要語言擴展 - 功能依賴或類型族。我們不得不說,Text
只能包含Char
s,ByteString
只能包含Word8
s,[]
可以包含任何類型,而Set
只能包含Ord
的實例。
他們有什麼常用功能集? AFAICS,只有將多個容器合併爲一個容器並生成空容器的能力。看哪,他們都是Monoid
,它提供了完全的界面!
因爲有些是多態的,有些是單形的,所以你不能做任何其他的事情。
像列表多態的容器,Sequence,Maybe和Map是Functor,Foldable和Traversable類型類的實例。
對於Set你只有Foldable,如奧德例如使其無法確定其他人(你可以定義fmap
(Data.Set.map),這將遵守法律函子,但它的簽署將要求論點奧德實例)。
如前所述,Text和Bytestring可以是定義類似類型類的實例,但您需要函數依賴或類型族。
[Set _is_ monoid](http://hackage.haskell.org/packages/archive/containers/0.5.2.1/doc/html/src/Data-Set-Base.html#line-231):由於該類有沒有多態函數/包含的類型在實例頭中是固定的,它在那裏表現爲單態容器。 - 順便說一下,甚至還有一種聰明的方法,可以[使其成爲Functor/Applicative/Monad](http://copilotco.com/mail-archives/haskell-cafe.2007/msg00051.html);這需要在GADT中綁定'Ord'實例。 – leftaroundabout
真的,好點。 – phadej
關於Set和Functor的更多信息:http://dorchard.wordpress.com/2011/10/18/subcategories-in-haskell-exofunctors/ – phadej
- 1. 從類型'int'分配類型't_result'時的不兼容類型,爲什麼?
- 2. 爲什麼typedef沒有強類型?
- 3. 爲什麼字面值沒有類型?
- 4. 爲什麼serialVersionUID的類型爲Serializable類的long類型
- 5. 什麼的內容腳本類型和內容樣式類型
- 6. 爲什麼元類有一個類型?
- 7. 沒有類類型
- 8. 泛型類型和泛型類型定義有什麼區別?
- 9. 什麼是back_inserter(容器)的類型
- 10. 什麼類型的CFBundleIconFiles數組類型
- 11. 將類型的泛型容器強制轉換爲繼承類型的容器?
- 12. E2010不兼容的類型,爲什麼?
- 13. 爲什麼不兼容的類型?
- 14. 爲什麼F#有兩種類型的顯式類型聲明?
- 15. Web APi Void,IIS express內容類型,IIS沒有內容類型
- 16. 類型錯誤:類型「類型」的對象沒有LEN()
- 17. 爲什麼Scala的Try沒有異常類型的類型參數?
- 18. 爲什麼空的ajax POST請求沒有內容類型?
- 19. Haskell:是沒有類型的類。爲什麼是整數?
- 20. 僅在C#中使用日期的類型 - 爲什麼沒有日期類型?
- 21. 類類型轉換:爲什麼類型轉換功能不叫
- 22. 爲什麼不能模板非類型參數是類類型
- 23. 什麼類型的
- 24. 爲什麼泛型類型的實例類與泛型類不一樣?
- 25. 什麼內容類型應爲4xx錯誤沒有身體?
- 26. 爲什麼扔類型「System.ArgumentException」
- 27. 類沒有指定類型
- 28. 爲什麼Haskell中沒有`Cofunctor`類型類?
- 29. 爲什麼Swift中沒有混合類協議類型?
- 30. 函數有什麼類型?
其實他們這樣做。但是「常見類型類」的列表通常僅限於「Monoid」,「Functor」和有時候「ListLike」。我認爲這是因爲其他課程不存在或不夠普遍。 – Yuras
順便說一句,看一下圖書館的'lens'軟件包,它已經找到了一種抽象方法來解決所有這些問題。但是它不會用新的類型類來實現,你可能會這樣想。 – Carl
@Yuras - 容器應該支持Traversable和Foldable(或者有一個很好的理由不這樣做)。 –