2011-04-19 25 views
7

kendim anlamak için bir girişim pozorvlak's baby steps post on Template Haskell aracılığıyla okuyorum Beyannameleri ve bu bölümde geldi: Biz programlı forma data Fred = Fred bildirimleri üretmeye çalışıyorlardıYerel değişkenler

Hatırlama. Şunu denemelerle deneyelim. Çünkü TH kodunu arayarak kısıtlamalar nedeniyle, kendi modülünde koymak zorunda, bu yüzden derleyici bulabilirsiniz böylece en Keyword.hs aşağıdaki koymak izin vereceğim:

Şimdi
module Keyword (keyword) where 

import Language.Haskell.TH.Syntax 
keyword name = [d| data $(name) = $(name) |] 

derlemek:

(dinamik olarak bağlı kere

:

Prelude> :l Keyword.hs 
[1 of 1] Compiling Keyword   (Keyword.hs, interpreted) 

Keyword.hs:6:24: parse error on input `$(' 

Bu benimle bir çan basamak ve Geçenlerde okumuştum başka bir şey, the Template Haskell package documentation benzer gibiydi) muhtemelen bağlam bağımlı bir şekilde onları istiyoruz, bu yüzden tekrar isim alanını istemiyoruz. Örneğin:

let v = mkName "T" in [| data $v = $v |] 
İşte

biz tür kurucusu ve veri yapıcısı

Eh için aynı Name Kullanıcılara bu hemen hemen aynı olduğunu, bu işe alabilirim bakalım:

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' 
:

bir koşuşturma ver

Hmm ... Belki de bildirim için d'u kullanmam gerekiyor mu?

let v = mkName "T" in [d| data $v = $v |] 

ve şimdi: Yani .... neler oluyor

Example.hs:3:31: parse error on input `$v' 

? Açık eklemeler kullanmak, her iki hatayı da değiştirmez. Şablon Haskell belgelerini bağlamdan mı alıyorum yoksa sadece yanlış mı?

+1

-XQuasiQuotes ile çalıştınız mı? – hammar

+0

@hammar: Aynı hatalar. – rampion

cevap