2011-04-19 10 views
7

estoy leyendo a través pozorvlak's baby steps post on Template Haskell en un intento de comprender por mí mismo, y me encontré con esta sección:Plantilla Haskell declaraciones

Recordemos que estábamos tratando de producir programación declaraciones de la forma data Fred = Fred. Probémoslo con quasiquoting. Debido a las restricciones de código de llamada TH, vamos a tener que ponerlo en su propio módulo, por lo que vamos a poner lo siguiente en Keyword.hs por lo que el compilador puede encontrarlo:

module Keyword (keyword) where 

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

Ahora compila:

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

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

Este renglón una campana conmigo, y parecía similar a algo más que había leído recientemente, the Template Haskell package documentation:

Por lo dinámicamente unido (NameS) probablemente los deseemos de una manera dependiente del contexto, así que de nuevo no queremos el espacio de nombre. Por ejemplo:

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

Aquí se utiliza el mismo Name tanto para el constructor tipo y constructor de datos

Bueno, eso es casi lo mismo, vamos a ver si puedo conseguir que funcione:

module Example where 
import Language.Haskell.TH 
let v = mkName "T" in [| data $v = $v |] 

darle un giro:

% ghc -XTemplateHaskell -c Example.hs 

Example.hs:3:25: parse error on input `data' 

Hmm ... Oh, ¿quizás necesito usar el d para cotizar la declaración?

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

y ahora:

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

Así que .... lo que está pasando? El uso de empalmes explícitos no cambia ninguno de los errores. ¿Estoy sacando la documentación de Template Haskell de contexto, o simplemente está mal?

+1

¿Has probado con -XQuasiQuotes? – hammar

+0

@hammar: Mismos errores. – rampion

Respuesta

Cuestiones relacionadas