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:
Şimdimodule 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:
İştelet v = mkName "T" in [| data $v = $v |]
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ı?
-XQuasiQuotes ile çalıştınız mı? – hammar
@hammar: Aynı hatalar. – rampion