概念(由概念TS定义)和类型类仅在限制可与通用函数一起使用的类型集方面相关。除此之外,我只能想到这两个功能有所不同的方式。
我应该注意到我不是一个Haskell专家。远非如此。然而,我是概念TS的专家(我编写了它,并为GCC实现了它)。
· 概念(和约束)是确定类型是否为集合成员的谓词。您无需显式声明类型是否为概念模型(类型类的实例)。这由一组要求确定并由编译器检查。事实上,概念根本不允许您编写“T是C的模型”,尽管可以使用各种元编程技术轻松支持此功能。
· 概念可用于约束非类型参数,并且由于constexpr函数和模板元编程,几乎可以表达您希望编写的任何约束(例如,其范围必须是质数的哈希数组)。我不认为类型类也可以做到这一点。
· 概念不是类型系统的一部分。它们限制声明的使用,在某些情况下还涉及模板参数推断。类型类是类型系统的一部分,并参与类型检查。
· 概念不支持模块化类型检查或编译。模板定义未针对概念进行检查,因此在实例化期间仍可能出现延迟捕获类型错误,但这确实为库编写者增加了一定程度的灵活性(例如,向算法添加调试代码不会更改接口)。由于类型类是类型系统的一部分,因此可以模块化地检查和编译通用算法。
· 概念TS支持基于约束排序的通用算法和数据结构的专业化。我根本不是Haskell的专家,所以我不知道是否存在等效项。我找不到一个。
· 使用概念永远不会增加运行时成本。上次我看到,类型类可能会施加与虚拟函数调用相同的运行时开销,尽管我知道Haskell非常擅长优化这些开销。
我认为这些是比较功能(概念TS)与功能(Haskell类型类)之间的主要区别。
但是两种语言有一个根本的哲学差异 - 它不是函数式与您正在编写的任何C ++风味之间的差异。 Haskell希望成为模块化:成为模块化具有许多良好的属性。 C ++模板拒绝成为模块化:实例化时查找允许进行基于类型的优化而无需运行时开销。这就是为什么C ++通用库同时提供广泛的重用和无与伦比的性能的原因。