2011-04-19 60 views
7

我通過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文檔置於上下文之外,還是僅僅是錯誤的?

+1

你用-XQuasiQuotes試過了嗎? – hammar 2011-04-19 21:17:03

+0

@hammar:同樣的錯誤。 – rampion 2011-04-19 21:20:21

回答