模板中的变量 Haskell 自定义准引号
Variables in Template Haskell custom quasiquoter
一个例子胜过千言万语。这是一个非常简单的 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 中的错误吗?
此问题现已在 GHC 8.2 中修复(参见 this commit)。
一个例子胜过千言万语。这是一个非常简单的 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 中的错误吗?
此问题现已在 GHC 8.2 中修复(参见 this commit)。