来自 Concepts TS 的 C++ 概念最近已合并到 GCC 主干中。概念允许人们通过要求类型满足概念的条件(例如“可比较”)来约束通用代码。
Haskell 有类型类。我对 Haskell 不是很熟悉。概念和类型类是如何相关的?
来自 Concepts TS 的 C++ 概念最近已合并到 GCC 主干中。概念允许人们通过要求类型满足概念的条件(例如“可比较”)来约束通用代码。
Haskell 有类型类。我对 Haskell 不是很熟悉。概念和类型类是如何相关的?
概念(由概念 TS 定义)和类型类仅在它们限制可与泛型函数一起使用的类型集的意义上相关。除此之外,我只能想到这两个功能不同的方式。
我应该注意,我不是 Haskell 专家。离得很远。但是,我是 Concepts TS 方面的专家(我编写了它,并为 GCC 实现了它)。
概念(和约束)是确定类型是否是集合成员的谓词。您不需要显式声明一个类型是否是概念模型(类型类的实例)。这是由一组要求决定并由编译器检查的。事实上,概念根本不允许您写“T
是”的模型C
,尽管使用各种元编程技术很容易支持这一点。
概念可用于约束非类型参数,并且由于constexpr
函数和模板元编程,几乎可以表达您希望编写的任何约束(例如,其范围必须是素数的哈希数组)。我不相信这对于类型类是正确的。
概念不是类型系统的一部分。它们限制了声明的使用,在某些情况下还限制了模板参数推导。类型类是类型系统的一部分并参与类型检查。
概念不支持模块化类型检查或编译。模板定义不会根据概念进行检查,因此您仍然可以在实例化过程中发现迟到的类型错误,但这确实为库编写者增加了一定程度的灵活性(例如,将调试代码添加到算法不会改变接口)。因为类型类是类型系统的一部分,所以可以模块化地检查和编译泛型算法。
Concepts TS 支持基于约束排序的通用算法和数据结构的专业化。我根本不是 Haskell 的专家,所以我不知道这里是否有等价物。我找不到一个。
概念的使用永远不会增加运行时成本。我上次查看时,类型类可能会产生与虚函数调用相同的运行时开销,尽管我知道 Haskell 非常擅长优化这些开销。
我认为这些是比较特征(概念 TS)和特征(Haskell 类型类)时的主要区别。
但是两种语言存在根本的哲学差异——与你正在编写的任何 C++ 风格相比,它都不是功能性的。Haskell 想要模块化:这样有很多不错的属性。C++ 模板拒绝模块化:实例化时查找允许基于类型的优化而没有运行时开销。这就是 C++ 泛型库提供广泛重用和无与伦比的性能的原因。
您可能对以下研究论文感兴趣:
“C++ 概念和 Haskell 类型类的比较”,Bernardy 等人,WGP 2008. Pdf 更多细节。
更新:作为论文的简短摘要:论文定义了 C++ 概念的术语和 Haskell 类型类的术语之间的精确映射,并使用此映射来提供两者之间的详细功能比较。
他们的结论是:
在我们总结在表 2 中的 27 条标准中,两种语言都支持 16 条,只有一两个是不可移植的。因此,我们可以安全地得出结论——C++ 概念和 Haskell 类型类非常相似。
正如下面 TC 所指出的,值得指出的是,该论文是在比较 C++0x 概念,而不是 Concepts TS。我不知道描述差异的良好参考。