为啥容器类型没有类型类?
Posted
技术标签:
【中文标题】为啥容器类型没有类型类?【英文标题】:Why is there no typeclass for container-types?为什么容器类型没有类型类? 【发布时间】:2013-07-17 16:12:58 【问题描述】:我发现有些容器有非常相似的功能集。例如,List、Set、Sequence、Text 和 Bytestrings。我想知道为什么他们不使用一个或多个常见的类型类。
【问题讨论】:
实际上是这样。但是“通用类型类”列表通常仅限于Monoid
、Functor
,有时还有ListLike
。我认为这是因为其他类不存在或不够常见。
顺便说一下,看看lens
包中的一个库,它找到了一种抽象所有这些的方法。但它不会像你想象的那样使用新的类型类。
@Yuras - 容器应该支持 Traversable 和 Foldable(或者有充分的理由不这样做)。
【参考方案1】:
他们有什么共同的功能集? AFAICS,只能将多个容器组合成一个容器,并生成空容器。看哪,他们确实都是Monoid
,它提供的正是那个界面!
你真的不能对所有这些做任何其他事情,因为有些是多态的,有些是单态的。
【讨论】:
【参考方案2】:其实有,见问题Making a single function work on lists, ByteStrings and Texts (and perhaps other similar representations),几乎和你的一样。
在一个单独的包中的主要原因可能是它需要一个语言扩展——无论是功能依赖还是类型系列。我们不得不说Text
只能包含Char
s,ByteString
只能包含Word8
s,[]
可以包含任何类型,Set
只能包含Ord
的实例。
【讨论】:
【参考方案3】:list、Sequence、Maybe 和 Map 等多态容器是 Functor、Foldable 和 Traversable 类型类的实例。
对于Set,您只有Foldable,因为Ord 实例无法定义其他实例(您可以定义遵循函子定律的fmap
(Data.Set.map),但它的签名需要Ord 实例的参数)。
如前所述,Text 和 Bytestring 可以是定义的类似类型类的实例,但您需要函数依赖或类型族。
【讨论】:
Set is monoid:因为该类没有多态函数/包含的类型在实例头中是固定的,所以它在那里表现为一个单态容器。 — 顺便说一句,你甚至可以通过一种巧妙的方式make it Functor/Applicative/Monad;这需要在 GADT 中绑定Ord
实例。
更多关于 Set 和 Functor:dorchard.wordpress.com/2011/10/18/…以上是关于为啥容器类型没有类型类?的主要内容,如果未能解决你的问题,请参考以下文章