我无法弄清楚为什么我在以下代码中收到“GHC 阶段限制”:
import Language.Haskell.TH
rules :: [ExpQ]
rules = [ [| \a -> a |], [| \_ -> 1 |] ]
findTransforms :: Int -> [ExpQ] -> Bool
findTransforms _ [] = False
findTransforms e (r:rs) = if ($r e) == 1 then True else findTransforms e rs
(如果代码没有任何用处,请不要担心 - 为了清晰起见,它提取了最小的示例进行了混淆)。
我不会从拼接代码中调用任何函数。为什么要限制舞台?
EDIT1:编辑以提供更简单的代码示例
最佳答案
这与您无法编写的原因相同
eval :: ExpQ -> Int
eval expr = $expr
因为它需要在运行时编译。
一种解决方案是通过返回嵌套
findTransforms
表达式的表达式而不是所述表达式的值来使 if
编译时也可以。findTransforms :: Int -> [ExpQ] -> ExpQ
findTransforms _ [] = [| False |]
findTransforms e (r:rs) = [| if $r e == 1 then True else $(findTransforms e rs) |]
当然,这意味着你要使用它时必须拼接它。
关于haskell - GHC 阶段限制(模板 Haskell),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12649650/