【发布时间】:2017-04-09 09:58:33
【问题描述】:
Rewrite rules 可以帮助您优化程序。我想知道如果我将我的对象包装在newtype 中它们是否会起作用。众所周知,newtype 不会带来性能损失,它是一个在运行时消失的编译时包装器。所以我想知道重写规则是否仍然会被newtype触发。例如,Data.Text (What is fusion in Haskell?) 有很多规则。
GHC 用户指南警告算法不智能:
GHC 目前使用一种非常简单的语法匹配算法来匹配规则 LHS 和表达式。它寻求一种替换,使 LHS 和表达式在语法上等于模 alpha 转换。如果需要,模式(规则)而不是表达式会被 eta 扩展。 (Eta 扩展表达式会导致惰性错误。)但不是 beta 转换(这称为高阶匹配)。
现在我正在使用Identity Text(出于某些原因)。我还能获得那些性能优势吗?我不是重写规则以自行执行基准测试并确保其结果的专家。
【问题讨论】:
-
不要忘记用户定义的重写规则并不是 GHC 执行的唯一优化。特别是内联可以极大地简化代码,并且经常消除中间的
newtypes。 (各种简化过程通常会产生像runIdentity . Identity这样的子表达式,可以很容易地删除它们。)这可能会触发进一步的重写规则。
标签: haskell optimization newtype