我无法弄清楚为什么我在以下代码中收到“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/

10-10 13:36