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