我通過pozorvlak's baby steps post on Template Haskell讀試圖瞭解它自己,我碰到這個節來了:我們試圖以編程方式產生形式data Fred = Fred
的聲明局部變量報關單
召回。讓我們嘗試quasiquoting。因爲調用TH代碼的限制,我們必須把它放在自己的模塊中,所以讓我們把在Keyword.hs下面這樣編譯器可以找到它:
module Keyword (keyword) where import Language.Haskell.TH.Syntax keyword name = [d| data $(name) = $(name) |]
現在編譯:
Prelude> :l Keyword.hs [1 of 1] Compiling Keyword (Keyword.hs, interpreted) Keyword.hs:6:24: parse error on input `$('
這響鐘我,似乎類似於其他的東西我最近讀了,the Template Haskell package documentation:
對於動態綁定的東西(
NameS
)我們可能希望它們以一種與上下文相關的方式,所以我們不再需要名稱空間。例如:let v = mkName "T" in [| data $v = $v |]
在這裏我們使用兩種類型的構造函數和數據構造
那麼同樣Name
,這幾乎是相同的,讓我們來看看,如果我能得到那個工作:
module Example where
import Language.Haskell.TH
let v = mkName "T" in [| data $v = $v |]
試一試:
% ghc -XTemplateHaskell -c Example.hs
Example.hs:3:25: parse error on input `data'
嗯...哦,也許我需要使用d
進行報價引用?
let v = mkName "T" in [d| data $v = $v |]
現在:
Example.hs:3:31: parse error on input `$v'
所以....這是怎麼回事?使用顯式拼接不會更改任何錯誤。我是否將模板Haskell文檔置於上下文之外,還是僅僅是錯誤的?
你用-XQuasiQuotes試過了嗎? – hammar 2011-04-19 21:17:03
@hammar:同樣的錯誤。 – rampion 2011-04-19 21:20:21