为什么容器类型没有类型类?

时间:2013-07-17 16:12:58

标签: haskell

我发现一些容器具有非常相似的功能集。例如,List,Set,Sequence,Text和Bytestrings。我想知道为什么他们不使用一个或多个常见的类型类。

3 个答案:

答案 0 :(得分:9)

他们有什么共同的功能集? AFAICS,只能将多个容器组合成一个容器,并生成空容器。事实上,他们都是Monoid,它提供了完全相同的界面!

你不可能对所有这些做任何其他事情,因为有些是多态的,有些是单态的。

答案 1 :(得分:7)

实际上有问题Making a single function work on lists, ByteStrings and Texts (and perhaps other similar representations),这几乎与你的一样重复。

在一个单独的包中的主要原因可能是它需要语言扩展 - 功能依赖或类型系列。我们必须以某种方式说Text只能包含CharByteString只能包含Word8 s,[]可以包含任何类型,{{1} }只能包含Set的实例。

答案 2 :(得分:3)

列表,SequenceMaybeMap等多态容器是FunctorFoldableTraversable类型类的实例。

对于Set,您只有Foldable,因为Ord实例无法定义其他实例(您可以定义fmapData.Set.map),这将遵守仿函数法则,但它的签名需要参数上的Ord实例。

如前所述,Text和Bytestring可以是定义类似类型类的实例,但您需要功能依赖或类型系列。