用newtype重写规则

She*_*rsh 5 optimization haskell newtype

重写规则可以帮助您优化程序.而且我想知道如果我将物体包裹起来它们是否会起作用newtype.众所周知,newtype它不会带来性能损失,它是一个在运行时消失的编译时包装器.所以我想知道是否仍会触发重写规则newtype.例如,Data.Text(Haskell中的融合是什么?)有很多规则.

GHC用户指南警告算法的非智能性:

GHC目前使用一种非常简单的语法匹配算法来匹配规则LHS和表达式.它寻求一种替代,使得LHS和表达在语法上等于模α转换.如果需要,模式(规则),但不是表达式,是eta扩展的.(Eta扩展表达式可能导致懒惰错误.)但不是beta转换(称为高阶匹配).

现在我正在经营Identity Text(出于某些原因).我还能获得这些性能优势吗?我不是重写规则的专家,我自己执行基准测试并确保他们的结果.

Joa*_*ner 6

重写规则适用于GHC的中间语言Core(而不是Haskell).到那个时候,newtype大部分已经消失了.例如,Identity x成为x |> c这里c是一个强制的是投射 x :: Text到类型的东西Identity Text.

这些演员阵容可以相互抵消,然后规则可以照常开火.因此,如果一切都到位,您仍然应该能够获得文本重写规则的好处.

不幸的是,没有硬性保证,并且没有查看中间代码(并且知道要查找什么,例如,如果您知道应该发生融合的某个地方),您无法确定使用Identity是否需要付出代价.