C++ 概念与 Haskell 类型类有何不同?

2024-05-20

Concepts TS 中的 C++ 概念最近已合并到 GCC 主干中。概念允许人们通过要求类型满足概念的条件(例如“可比较”)来约束通用代码。

Haskell 有类型类。我对 Haskell 不太熟悉。概念和类型类如何相关?


概念(由概念 TS 定义)和类型类仅在它们限制可与泛型函数一起使用的类型集的意义上相关。除此之外,我只能想到这两个功能的不同之处。

我应该指出,我不是 Haskell 专家。离得很远。不过,我是 Concepts TS 方面的专家(我编写了它,并为 GCC 实现了它)。

  • 概念(和约束)是确定类型是否是集合成员的谓词。您不需要显式声明类型是否是概念模型(类型类的实例)。这是由一组要求确定并由编译器检查的。事实上,概念不允许你写“T是一个模型C” 无论如何,尽管使用各种元编程技术很容易支持这一点。

  • 概念可以用来约束非类型参数,并且因为constexpr函数和模板元编程,几乎可以表达您希望编写的任何约束(例如,其范围必须是素数的哈希数组)。我不认为这对于类型类来说是正确的。

  • 概念不是类型系统的一部分。它们限制声明的使用,并且在某些情况下限制模板参数推导。类型类是类型系统的一部分并参与类型检查。

  • 概念不支持模块化类型检查或编译。模板定义不会根据概念进行检查,因此您仍然可以在实例化过程中发现迟到的类型错误,但这确实为库编写者增加了一定程度的灵活性(例如,向算法添加调试代码不会更改接口)。由于类型类是类型系统的一部分,因此可以模块化地检查和编译通用算法。

  • Concepts TS 支持基于约束排序的通用算法和数据结构的专业化。我根本不是 Haskell 的专家,所以我不知道这里是否有等效的东西。我找不到一个。

  • 概念的使用永远不会增加运行时间成本。上次我查看时,类型类可能会产生与虚拟函数调用相同的运行时开销,尽管我知道 Haskell 非常擅长优化这些开销。

我认为这些是比较功能(Concepts TS)和功能(Haskell 类型类)时的主要区别。

但是两种语言之间存在根本的哲学差异——并且与您正在编写的任何风格的 C++ 相比,它都不是函数式的。 Haskell 想要模块化:模块化有很多好的特性。 C++ 模板拒绝模块化:实例化时查找允许基于类型的优化,而无需运行时开销。这就是 C++ 泛型库提供广泛的重用性和无与伦比的性能的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 概念与 Haskell 类型类有何不同? 的相关文章

随机推荐