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?
¿Has probado con -XQuasiQuotes? – hammar
@hammar: Mismos errores. – rampion