GHC重写规则是否知道识别语法糖?

时间:2014-12-05 16:17:45

标签: haskell ghc

例如对于列表,如果我编写一个LHS为myFn [x]的规则,那么当程序员写myFn (x:[])时它是否也可以触发?或者我是否必须为每种可能的语法编写单独的规则?

2 个答案:

答案 0 :(得分:7)

重写规则得到去糖。所以像

这样的重写规则
{-# RULES
  "myFn/singleton"    forall x. myFn [x] = myOtherFn x
#-}

将在内部存储为

forall x. myFn (x:[]) = myOtherFn x

然后将其应用于程序的脱糖形式。 (GHC中的所有优化都发生在程序的脱糖形式上)。

答案 1 :(得分:4)

我的理解是,像这样纯粹的语法事物并不重要;该规则将以任何一种方式开火。

发现的问题是GHC尝试使用该规则时可能已经内联myFn(因此没有任何内容可以触发) 。一般来说,弄清楚何时启用你的规则是很难的部分!