haskell template-haskell

Variables locales en declaraciones de Template Haskell



template-haskell (1)

Estoy leyendo Pozorvlak''s baby steps post en Template Haskell en un intento de entenderlo yo mismo, y me encontré con esta sección:

Recuerde que estábamos tratando de producir programáticamente declaraciones de los data Fred = Fred del formulario data Fred = Fred . Probémoslo con quasiquoting. Debido a las restricciones para llamar al código TH, tendremos que ponerlo en su propio módulo, así que pongamos lo siguiente en Keyword.hs para que el compilador pueda 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 `$(''

Me sonó campante y me pareció similar a otra cosa que había leído recientemente, la documentación del paquete Template Haskell :

Para cosas enlazadas dinámicamente ( NameS ), probablemente las 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í usamos el mismo Name para el constructor de tipos y el constructor de datos

Bueno, eso es casi lo mismo, veamos si puedo lograr 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 la d para citar una declaración?

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

y ahora:

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

Entonces ... ¿qué 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?