所以,我开始尝试使用准引号和模板haskell。
我想修改现有的(大的)准引号代码,同时使用在“调用”处定义的变量的实际值。用一个简单的例子来说明:
主要.hs
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
import Language.Haskell.TH
import Exp02
x = "cde"
main = do
putStrLn [str|$x|]
过期02.hs
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
module Exp02 where
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
import Language.Haskell.TH.Quote
xpto :: String -> ExpQ
xpto [] = stringE []
xpto ('$':rest) = varE (mkName rest)
xpto str = stringE str
str = QuasiQuoter
{ quoteExp = xpto
, quotePat = fail $ "patterns"
, quoteType= fail $ "types"
, quoteDec = fail $ "declarations"
}
虽然这会编译并打印出“cde”,但这不是我想要的。我的理解是,拼接后得到的主要代码是:
putStrLn x
。我想要的是生成
putStrLn cde
(我知道这不是有效的haskell代码,但这只是为了表达我的观点)。
因此,换句话说,我不想“创建对变量的引用”
x
在主文件中,我想在
xpto
准引号。
我猜这可能是不可能的,因为这意味着在
main.hs
和
Exp02.hs
从而面临TH阶段的限制。这是正确的吗,或者有没有办法使用x
价值
内部
xpto公司
密码
谢谢