例如对于列表,如果我编写一个LHS为myFn [x]
的规则,那么当程序员写myFn (x:[])
时它是否也可以触发?或者我是否必须为每种可能的语法编写单独的规则?
答案 0 :(得分:7)
重写规则得到去糖。所以像
这样的重写规则{-# RULES
"myFn/singleton" forall x. myFn [x] = myOtherFn x
#-}
将在内部存储为
forall x. myFn (x:[]) = myOtherFn x
然后将其应用于程序的脱糖形式。 (GHC中的所有优化都发生在程序的脱糖形式上)。
答案 1 :(得分:4)
我的理解是,像这样纯粹的语法事物并不重要;该规则将以任何一种方式开火。
你将发现的问题是GHC尝试使用该规则时可能已经内联myFn
(因此没有任何内容可以触发) 。一般来说,弄清楚何时启用你的规则是很难的部分!