为啥容器类型没有类型类?

Posted

技术标签:

【中文标题】为啥容器类型没有类型类?【英文标题】:Why is there no typeclass for container-types?为什么容器类型没有类型类? 【发布时间】:2013-07-17 16:12:58 【问题描述】:

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

【问题讨论】:

实际上是这样。但是“通用类型类”列表通常仅限于MonoidFunctor,有时还有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只能包含Chars,ByteString只能包含Word8s,[]可以包含任何类型,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/…

以上是关于为啥容器类型没有类型类?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 容器与继承

为啥 testcontainers 在测试类之间重启容器

函数式编程:容器类型值类型

继承类类型的c ++容器

spring注入时bean的set方法为啥不能是static类型的?

泛星容器类ArrayList