5

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

4

3 回答 3

9

他们有什么共同的功能集?AFAICS,只能将多个容器组合成一个容器,并生成空容器。看哪,确实它们都Monoid提供了该界面!

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

于 2013-07-17T16:19:10.243 回答
7

实际上有,请参阅使单个函数在列表、字节字符串和文本(可能还有其他类似的表示)上工作的问题,这几乎是您的副本。

放在一个单独的包中的主要原因可能是它需要一个语言扩展——函数依赖或类型系列。我们必须以某种方式说,Text只能包含Chars,ByteString只能包含Word8s,[]可以包含任何类型,并且Set只能包含 的实例Ord

于 2013-07-17T16:49:55.873 回答
3

像 list、SequenceMaybeMap这样的多态容器是FunctorFoldableTraversable类型类的实例。

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

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

于 2013-07-18T16:59:41.177 回答