一个例子值一千字。这是我刚刚编写的一个非常简单的quasi quoter

import Language.Haskell.TH.Quote
import Language.Haskell.TH.Syntax

quoter :: QuasiQuoter
quoter = QuasiQuoter { quotePat = parse }
  where
    parse :: String -> Q Pat
    parse ('$':x) = pure (VarP (mkName x))
    parse "_" = pure WildP
    parse _ = fail "Invalid pattern"

然后,在GHCi中使用它
ghci> :set -XQuasiQuotes
ghci> [quoter|_|] = 2
ghci> [quoter|$x|] = 2
ghci> x
error: Variable not in scope: x

我希望2绑定(bind)到x。因此:有什么方法可以在自定义准报价中引入变量模式,以便我们再次使用?请注意,我的实际用例比上述情况要复杂得多-parse实际上做了一些实质性的工作。

编辑

以下作品:
 ghci> inc [quoter|$x|] = x + 1
 ghci> inc 2
 3

并且以下不
 ghci> let [quoter|$x|] = 1 in x
 error: Variable not in scope: x

这是GHCi中的错误吗?

最佳答案

现在已在GHC 8.2中对此问题进行了修复(请参阅this commit)。

关于haskell - 模板Haskell自定义准报价器中的变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42967102/

10-13 03:09