【问题标题】:How are c++ concepts different to Haskell typeclasses?c++ 概念与 Haskell 类型类有何不同?
【发布时间】:2015-08-20 17:29:14
【问题描述】:

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

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

【问题讨论】:

  • 概念是当前无类型元编程工具的类型系统的一种形式(一切都是typename,不看值参数)。类型类允许根据参数类型重载/选择函数。 m.reddit.com/r/haskell/comments/1e9f49/…这可能是一个相关的讨论。

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


【解决方案1】:

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

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

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

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

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

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

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

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

我认为这些是比较特征(概念 TS)和特征(Haskell 类型类)时的主要区别。

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

【讨论】:

  • 在实践中,Haskell 的模块化有些受限,因为它的编译很大程度上依赖于内联和性能专门化。如果一个模块以任何方式被修改,所有导入它的模块都需要重新编译。有一些技术可以执行各种类型的类型驱动优化(例如在大小由其类型固定的数据结构上展开循环),还有一个用于用户定义的编译器重写规则的有点狂野的系统。
  • C++0x 概念和Concepts TS 的区别你有很好的参考吗?我的印象是前者确实实现了模块化类型检查,所以假设后来为 Concepts TS 放弃了这一点是否正确?
  • 还没有好的参考。 C++0x 概念与类型类没有太大区别。 Concepts TS 使用谓词来定义约束,并且不包括模块化类型检查。
  • 这里回复晚了,但有一点更正:据我所知,Haskell 类型类在编译时构造中,只要您不使用存在量化。有关详细信息,请参阅stackoverflow.com/questions/28169119/…
  • 作为一个实际的人,如果涉及到 Haskell 类型类 -> C++ 概念归结为 1 个问题:概念是否支持以下陈述:“必须有一个函数 std::string foo(const T& arg) 与概念相关的参数类型列表。”?要点是:我必须测试概念的第一个想法是有一个“概念秀”,它就像 Haskells Show 类型类......然后开始阅读和谷歌搜索。另外,我记得当我开始学习 Haskell 时,IRC 中没有人建立联系,旧式 C++ 接口可以在 Haskell 中以类型类的形式找到..
【解决方案2】:

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

“C++ 概念和 Haskell 类型类的比较”,Bernardy 等人,WGP 2008。PdfMore details

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

他们的结论是:

在表 2 中总结的 27 项标准中,两种语言均支持 16 项,只有一两个是不可移植的。因此,我们可以放心地得出结论——C++ 概念和 Haskell 类型类非常相似。

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

【讨论】:

  • 您能从论文中添加一位专家吗?社区通常对“仅链接”问题不满意!
  • @recursion.ninja 摘录?
  • @Jubobs 不,他应该从论文中添加一个专家。他必须选择其中一位作者并将他/她数字化到他的帖子中。我虽然很清楚;)
  • @recursion.ninja 啊!讽刺! :)
  • C++0x 草案中的概念(引用的论文正在比较)与概念 TS 中的概念完全不同。
猜你喜欢
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多