【问题标题】:Rewrite rules with newtype用 newtype 重写规则
【发布时间】: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


【解决方案1】:

重写规则适用于 GHC 的中间语言 Core(而不是 Haskell)。到那时,newtype 已经基本消失了。例如,Identity x 变为 x |> c,其中 c强制,将x :: Text 强制转换为Identity Text 类型。

这些施法可以相互抵消,然后规则可以照常触发。因此,如果一切就绪,您仍然应该能够获得文本重写规则的好处。

不幸的是,没有硬性保证,并且如果不查看中间代码(并且知道要查找的内容,例如,如果您知道应该发生融合的某个地方),您无法确定使用 Identity 确实在这里不花钱。

【讨论】:

  • 非常感谢!我希望看到一些基准,但这样的解释对我来说已经很好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 2010-11-20
相关资源
最近更新 更多