我发现一些容器具有非常相似的功能集。例如,List,Set,Sequence,Text和Bytestrings。我想知道为什么他们不使用一个或多个常见的类型类。
答案 0 :(得分:9)
他们有什么共同的功能集? AFAICS,只能将多个容器组合成一个容器,并生成空容器。事实上,他们都是Monoid
,它提供了完全相同的界面!
你不可能对所有这些做任何其他事情,因为有些是多态的,有些是单态的。
答案 1 :(得分:7)
实际上有问题Making a single function work on lists, ByteStrings and Texts (and perhaps other similar representations),这几乎与你的一样重复。
在一个单独的包中的主要原因可能是它需要语言扩展 - 功能依赖或类型系列。我们必须以某种方式说Text
只能包含Char
,ByteString
只能包含Word8
s,[]
可以包含任何类型,{{1} }只能包含Set
的实例。
答案 2 :(得分:3)
列表,Sequence,Maybe和Map等多态容器是Functor,Foldable和Traversable类型类的实例。
对于Set,您只有Foldable,因为Ord实例无法定义其他实例(您可以定义fmap
(Data.Set.map),这将遵守仿函数法则,但它的签名需要参数上的Ord实例。
如前所述,Text和Bytestring可以是定义类似类型类的实例,但您需要功能依赖或类型系列。