zoco simbolos opciones mundo imprimir hola hacer funciones ejemplos definicion como basico haskell template-haskell type-families reify associated-types

simbolos - imprimir en haskell



Obtención de sinónimos de tipo asociados con plantilla Haskell (1)

No está implementado porque nadie lo solicitó.

Lo extraño es que TH utiliza su propio AST, que no sigue el AST del compilador interno. Como resultado, cualquier nueva característica (por ejemplo, familias de tipos asociadas) no está disponible automáticamente a través de TH. Alguien tiene que abrir un ticket e implementarlo.

Para la referencia: la función reifyClass interna ignores las familias de tipos asociadas (es el quinto elemento de la tupla devuelta por classExtraBigSig , consulte también la definición de ClassATItem ).

Técnicamente, debería ser fácil implementar el tipo de soporte de familia asociado en reify , pero lo más probable es que requiera cambios incompatibles hacia atrás en la API de TH, por ejemplo, porque su AST no parece admitir los valores predeterminados de tipo asociados.

Agregado: ahora está implemented (sin cambio de API por cierto) y probablemente estará disponible en la próxima versión de ghc .

¿Puede Template Haskell averiguar los nombres y / o las declaraciones de los sinónimos de tipo asociados declarados en una clase de tipo? Esperaba que reify hiciera lo que quisiera, pero no parece proporcionar toda la información necesaria. Funciona para obtener firmas de tipo de función:

% ghci GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help ... Prelude> -- I''ll be inserting line breaks and whitespace for clarity Prelude> -- in all GHCi output. Prelude> :set -XTemplateHaskell Prelude> import Language.Haskell.TH Prelude Language.Haskell.TH> class C a where f :: a -> Int Prelude Language.Haskell.TH> putStrLn $(stringE . show =<< reify ''''C) ClassI (ClassD [] Ghci1.C [PlainTV a_1627398388] [] [SigD Ghci1.f (ForallT [PlainTV a_1627398388] [ClassP Ghci1.C [VarT a_1627398388]] (AppT (AppT ArrowT (VarT a_1627398388)) (ConT GHC.Types.Int)))]) []

Sin embargo, al agregar un sinónimo de tipo asociado a la clase no se producen cambios (hasta el cambio de nombre) en la salida:

Prelude Language.Haskell.TH> :set -XTypeFamilies Prelude Language.Haskell.TH> class C'' a where type F a :: * ; f'' :: a -> Int Prelude Language.Haskell.TH> putStrLn $(stringE . show =<< reify ''''C'') ClassI (ClassD [] Ghci3.C'' [PlainTV a_1627405973] [] [SigD Ghci3.f'' (ForallT [PlainTV a_1627405973] [ClassP Ghci3.C'' [VarT a_1627405973]] (AppT (AppT ArrowT (VarT a_1627405973)) (ConT GHC.Types.Int)))]) []

Si conozco el nombre de F , puedo buscar información al respecto:

Prelude Language.Haskell.TH> putStrLn $(stringE . show =<< reify ''''F) FamilyI (FamilyD TypeFam Ghci3.F [PlainTV a_1627405973] (Just StarT)) []

Pero no puedo encontrar el nombre de F en primer lugar. Incluso si agrego una instancia de la clase de tipo, el InstanceD no tiene ninguna información sobre la definición:

Prelude Language.Haskell.TH> instance C'' [a] where type F [a] = a ; f'' = length Prelude Language.Haskell.TH> f'' "Haskell" 7 Prelude Language.Haskell.TH> 42 :: F [Integer] 42 Prelude Language.Haskell.TH> putStrLn $(stringE . show =<< reify ''''C'') ClassI (ClassD [] Ghci3.C'' [PlainTV a_1627405973] [] [SigD Ghci3.f'' (ForallT [PlainTV a_1627405973] [ClassP Ghci3.C'' [VarT a_1627405973]] (AppT (AppT ArrowT (VarT a_1627405973)) (ConT GHC.Types.Int)))]) [InstanceD [] (AppT (ConT Ghci3.C'') (AppT ListT (VarT a_1627406161))) []]

Si reify no funciona, ¿hay alguna solución alternativa que no sea listar manualmente los sinónimos de tipo asociado?

Este problema está presente en GHC 7.8.3 con la versión 2.9.0.0 del paquete template-haskell; también estaba presente en GHC 7.4.2 con la versión 2.7.0.0 del paquete template-haskell. (No verifiqué GHC 7.6. *, Pero me imagino que también estaba presente allí). Me interesan las soluciones para cualquier versión de GHC (incluido "esto solo se solucionó en la versión V de GHC").