模板Haskell自定义quasiquoter中的变量

时间:2017-03-23 04:09:22

标签: haskell ghc template-haskell

一个例子胜过千言万语。这是一个非常简单的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绑定到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中的一个错误吗?

1 个答案:

答案 0 :(得分:0)

现在已在GHC 8.2中修复(见this commit)。