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

o2rvlv0m  于 2023-11-18  发布在  其他
关注(0)|答案(2)|浏览(113)

Concepts TS中的C++概念最近被合并到GCC Backbone.js 中。Concepts允许通过要求类型满足概念的条件(例如“Comparable”)来约束泛型代码。
Haskell有类型类。我对Haskell不是很熟悉。概念和类型类是如何联系的?

kmb7vmvb

kmb7vmvb1#

概念(由概念TS定义)和类型类的相关性仅在于它们限制了可以与泛型函数一起使用的类型集。除此之外,我只能想到这两个特性的不同之处。
我应该指出,我不是一个HaskellMaven。远非如此。然而,我是TS概念的Maven(我写了它,我为GCC实现了它)。

  • 概念(和约束)是确定类型是否是集合的成员的 predicate 。您不需要显式声明类型是否是概念模型(类型类的示例)。这是由一组要求决定的,并由编译器检查。事实上,概念根本不允许你写“TC的模型“,尽管这可以使用各种元编程技术来容易地支持。
  • 概念可以用来约束非类型参数,并且由于constexpr函数和模板元编程,可以表达几乎任何你希望编写的约束(例如,范围必须是素数的散列数组)。
  • 概念不是类型系统的一部分。它们约束声明的使用,在某些情况下还约束模板参数推导。类型类是类型系统的一部分,并参与类型检查。
  • 概念不支持模块化类型检查或编译。模板定义不针对概念进行检查,因此在示例化期间仍然可能会遇到后期捕获的类型错误,但这确实为库编写者增加了一定程度的灵活性(例如,将调试代码添加到算法不会更改接口)。因为类型类是类型系统的一部分,所以可以模块化地检查和编译泛型算法。
  • Concepts TS支持基于约束排序的泛型算法和数据结构的专门化。我根本不是Haskell的Maven,所以我不知道这里是否有等效的。我找不到。
  • 概念的使用永远不会增加运行时开销。上次我看到的时候,类型类可能会带来与虚函数调用相同的运行时开销,尽管我知道Haskell非常擅长优化这些开销。

我认为这些是比较特性(概念TS)和特性(Haskell类型类)的主要区别。
但是这两种语言之间有一个根本的哲学差异--它不是函数式的,也不是你正在编写的任何风格的C++。Haskell想要模块化:这样有很多好的属性。C模板拒绝模块化:示例化时查找允许基于类型的优化而没有运行时开销。这就是为什么C泛型库提供广泛的重用和无与伦比的性能。

vcudknz3

vcudknz32#

您可能对以下研究论文感兴趣:
“A comparison of C++ concepts and Haskell type classes”,Bernardy et al.,WGP 2008. PdfMore details .
更新:作为本文的简短总结:本文定义了C++概念术语和Haskell类型类术语之间的精确Map,并使用此Map提供了两者之间的详细功能比较。

  • 他们的结论是:*

在我们的27个标准中,总结在表2中,16个在两种语言中都得到了同等的支持,只有一两个是不可移植的。因此,我们可以安全地得出结论,因为我们开始- C概念和Haskell类型类非常相似。
正如下面T.C.所指出的,值得指出的是,这篇论文是比较C
0x概念,而不是概念TS。我不知道有什么好的参考文献描述了这些差异。

相关问题