2013-07-17 166 views
5

我發現一些容器有一個非常相似的功能集。例如,List,Set,Sequence,Text和Bytestrings。我想知道他們爲什麼不使用一個或多個常見的類型類。爲什麼沒有類型類型的容器類型?

+1

其實他們這樣做。但是「常見類型類」的列表通常僅限於「Monoid」,「Functor」和有時候「ListLike」。我認爲這是因爲其他課程不存在或不夠普遍。 – Yuras

+3

順便說一句,看一下圖書館的'lens'軟件包,它已經找到了一種抽象方法來解決所有這些問題。但是它不會用新的類型類來實現,你可能會這樣想。 – Carl

+2

@Yuras - 容器應該支持Traversable和Foldable(或者有一個很好的理由不這樣做)。 –

回答

9

他們有什麼常用功能集? AFAICS,只有將多個容器合併爲一個容器並生成空容器的能力。看哪,他們都是Monoid,它提供了完全的界面!

因爲有些是多態的,有些是單形的,所以你不能做任何其他的事情。

3

像列表多態的容器,SequenceMaybeMapFunctorFoldableTraversable類型類的實例。

對於Set你只有Foldable,如奧德例如使其無法確定其他人(你可以定義fmapData.Set.map),這將遵守法律函子,但它的簽署將要求論點奧德實例)。

如前所述,Text和Bytestring可以是定義類似類型類的實例,但您需要函數依賴或類型族。

+0

[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

+0

真的,好點。 – phadej

+1

關於Set和Functor的更多信息:http://dorchard.wordpress.com/2011/10/18/subcategories-in-haskell-exofunctors/ – phadej

相關問題