是否存在与类型类相关的运行时惩罚?

Jon*_*ark 19 haskell typeclass

标题几乎总结了我的问题:是否存在与Haskell的类型类相关的运行时代价,或者它只是其中一种(如幻像类型)而没有任何运行时结果?

Edw*_*ETT 16

需要类型类就像传递一个额外的参数包含的类型类作为数据结构的成员函数,因为后面这是它desugars到GHC的场景.

也就是说,GHC非常擅长内联和专门化使用类型类的代码到不是问题的地方,-O2很大一部分就消失了,但即使没有那种优化级别传递参数也相当便宜.

所以开销比幻影型或NEWTYPE更多,但它也不是很高.

另外,其他编译器的开销可能会有所不同.例如,JHC使用有限形式的依赖类型有效地对类型构造函数执行案例分析,因此您需要支付约束类型变量的数量,而不是在JHC中工作时的约束数量.

  • 传递额外的论点很便宜.在该传递记录中调用未知函数非常昂贵.所以类型类非常昂贵,除非编译器设法将它们专门化. (16认同)
  • 是的,我想我应该添加一个警告,即从你传递的字典中调用函数需要至少一次,通常是2次间接跳转,这意味着管道停顿等. (2认同)