我发现有些容器有非常相似的功能集。例如,List、Set、Sequence、Text 和 Bytestrings。我想知道为什么他们不使用一个或多个常见的类型类。
问问题
419 次
3 回答
9
他们有什么共同的功能集?AFAICS,只能将多个容器组合成一个容器,并生成空容器。看哪,确实它们都Monoid
提供了该界面!
你真的不能对所有这些做任何其他事情,因为有些是多态的,有些是单态的。
于 2013-07-17T16:19:10.243 回答
7
实际上有,请参阅使单个函数在列表、字节字符串和文本(可能还有其他类似的表示)上工作的问题,这几乎是您的副本。
放在一个单独的包中的主要原因可能是它需要一个语言扩展——函数依赖或类型系列。我们必须以某种方式说,Text
只能包含Char
s,ByteString
只能包含Word8
s,[]
可以包含任何类型,并且Set
只能包含 的实例Ord
。
于 2013-07-17T16:49:55.873 回答
3
像 list、Sequence、Maybe和Map这样的多态容器是Functor、Foldable和Traversable类型类的实例。
对于Set你只有Foldable,因为 Ord 实例无法定义其他实例(你可以定义fmap
(Data.Set.map)遵守函子定律,但它的签名需要 Ord 实例的参数)。
如前所述,Text 和 Bytestring 可以是定义的类似类型类的实例,但您将需要功能依赖项或类型族。
于 2013-07-18T16:59:41.177 回答