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

jbc*_*coe 32 c++ haskell c++-concepts

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

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

And*_*ton 41

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

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

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

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

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

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

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

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

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

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


Dom*_*ese 17

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

"C++的概念和Haskell类型类的比较",Bernardy等人,2008年WGP 全文 更多细节.

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

他们的结论说:

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

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

  • C++ 0x草案中的概念(被引用的论文正在比较)与Concepts TS中的概念完全不同. (8认同)
  • @Jubobs不,他应该从论文中添加*专家*.他必须带一位作者并将他/她数字化为他的职位.我虽然很清楚;) (7认同)
  • 你能从论文中加一位专家吗?社区通常对"仅链接"问题表示不满! (2认同)