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

时间:2015-08-20 17:29:15

标签: c++ haskell c++-concepts

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

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

2 个答案:

答案 0 :(得分:37)

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

我应该注意到我不是Haskell专家。离得很远。但是,我是Concepts TS的专家(我写了它,我为GCC实现了它。)

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

  • 概念可用于约束非类型参数,并且由于constexpr函数和模板元编程,几乎表达了您希望编写的任何约束(例如,其范围必须的哈希数组)是一个素数)。我不相信类型课程也是如此。

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

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

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

  • 概念的使用永远不会增加运行时成本。我最后一次看,类型类可能会产生与虚函数调用相同的运行时开销,尽管我知道Haskell非常善于优化它们。

我认为在将功能(概念TS)与功能(Haskell类型类)进行比较时,这些是主要区别。

但是在两种语言中存在潜在的哲学差异 - 它不具有功能性,与您正在编写的C ++风格无关。 Haskell想要模块化:因此有许多不错的属性。 C ++模板拒绝模块化:实例化时间查找允许基于类型的优化,而无需运行时开销。这就是C ++通用库提供广泛的重用和无与伦比的性能的原因。

答案 1 :(得分:14)

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

“C ++概念与Haskell类型类的比较”,Bernardy等,WGP 2008. Pdf More details

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

他们的结论是:

  

在表2中总结的27项标准中,16种语言同样支持两种语言,只有一两种不可移植。因此,我们可以在开始时安全地得出结论--C ++概念和Haskell类型类非常相似。

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