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

How are c++ concepts different to Haskell typeclasses?

Concepts TS 中的 C++ 概念最近已合并到 GCC 主干中。概念允许通过要求类型满足概念的条件(例如'Comparable')来约束泛型代码。

Haskell 的类型为 类。我对 Haskell 不是很熟悉。概念和类型 类 有什么关系?

您可能对以下研究论文感兴趣:

"A comparison of C++ concepts and Haskell type classes",Bernardy 等人,WGP 2008。Pdf More details

更新:作为论文的简短摘要:本文定义了 C++ 概念术语与 Haskell 类型 类 术语之间的精确映射,并使用此映射提供详细的功能比较两者之间。

他们的结论是:

Out of our 27 criteria, summarised in table 2, 16 are equally supported in both languages, and only one or two are not portable. So, we can safely conclude as we started — C++ concepts and Haskell type classes are very similar.

如 T.C 所述。下面,值得指出的是,这篇论文比较的是 C++0x 概念,而不是 Concepts TS。我不知道描述差异的好参考。

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

请注意,我不是 Haskell 专家。离得很远。但是,我是 Concepts TS 方面的专家(我编写了它,并为 GCC 实现了它)。

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

  • 概念可用于约束非类型参数,并且由于 constexpr 函数和模板元编程,几乎可以表达您希望编写的任何约束(例如,散列范围必须是质数的数组)。我不相信 classes.

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

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

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

  • 概念的使用绝不会增加运行时成本。我最后一次查看时,键入 classes 可能会造成与虚函数调用相同的运行时开销,尽管我知道 Haskell 非常擅长优化那些。

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

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