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 formulariodata 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?
Parece que es un error con las versiones de GHC anteriores a 6.12 donde no se puede empalmar en tipos .