2
我剛開始學習模板Haskell,並堅持與拼接簡單的問題。
在一個模塊我實現功能tupleN
其回覆元組的第N個元素:
問題與模板Haskell舞臺限制
tupleN :: Lift a => a -> Int -> Q Exp
tupleN a n = do
(TupE as) <- lift a
return $ as !! n
在主模塊我有:
main :: IO()
main = do
let tup = (1::Int,'a',"hello")
putStrLn $ show $(tupleN $tup 1)
這似乎是工作,但它不會。編譯器顯示錯誤:
GHC stage restriction: `tup'
is used in a top-level splice or annotation,
and must be imported, not defined locally
In the expression: tup
In the first argument of `tupleN', namely `$tup'
In the expression: tupleN ($tup) 1
如果我把元組的描述直接進入拼接表達,代碼成爲工作:
main :: IO()
main = do
putStrLn $ show $(tupleN (1::Int,'a',"hello") 1)
我與第一個變體丟失了怎麼辦?
模板哈斯克爾工作在編譯時,不是運行。拼接必須能夠在編譯時運行。 –
@LouisWasserman我知道這條規則:)我只想把'tup'變量捕獲到拼接表達式中。關於'tup'類型的信息在編譯時可用,所以可以在這裏捕獲它,我想。 –