gpt4 book ai didi

haskell - GHC 阶段限制(模板 Haskell)

转载 作者:行者123 更新时间:2023-12-02 07:21:38 25 4
gpt4 key购买 nike

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

因为它需要在运行时编译。

一种解决方案是通过返回嵌套 if 表达式的表达式而不是所述表达式的值来使 findTransforms 编译时。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com