She*_*rsh 5 optimization haskell newtype
重写规则可以帮助您优化程序.而且我想知道如果我将物体包裹起来它们是否会起作用newtype
.众所周知,newtype
它不会带来性能损失,它是一个在运行时消失的编译时包装器.所以我想知道是否仍会触发重写规则newtype
.例如,Data.Text
(Haskell中的融合是什么?)有很多规则.
GHC用户指南警告算法的非智能性:
GHC目前使用一种非常简单的语法匹配算法来匹配规则LHS和表达式.它寻求一种替代,使得LHS和表达在语法上等于模α转换.如果需要,模式(规则),但不是表达式,是eta扩展的.(Eta扩展表达式可能导致懒惰错误.)但不是beta转换(称为高阶匹配).
现在我正在经营Identity Text
(出于某些原因).我还能获得这些性能优势吗?我不是重写规则的专家,我自己执行基准测试并确保他们的结果.
重写规则适用于GHC的中间语言Core(而不是Haskell).到那个时候,newtype
大部分已经消失了.例如,Identity x
成为x |> c
这里c
是一个强制的是投射 x :: Text
到类型的东西Identity Text
.
这些演员阵容可以相互抵消,然后规则可以照常开火.因此,如果一切都到位,您仍然应该能够获得文本重写规则的好处.
不幸的是,没有硬性保证,并且没有查看中间代码(并且知道要查找什么,例如,如果您知道应该发生融合的某个地方),您无法确定使用Identity
是否需要付出代价.