Tengo un programa Haskell Plantilla trivial que imprime el nombre del módulo actual (Principal, aquí):¿Por qué TemplateHaskell hace que GHC cargue paquetes?
{-# LANGUAGE TemplateHaskell #-}
module Main
(main
) where
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
modName ∷ String
modName = $(fmap loc_module qLocation »= λmod → return (LitE (StringL mod)))
main ∷ IO()
main = putStrLn modName
Cuando compilo este, consigo los siguientes mensajes de carga de GHC:
[email protected] ~/test/modname $ ghc --make Main
[1 of 1] Compiling Main (Main.hs, Main.o)
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package array-0.4.0.0 ... linking ... done.
Loading package deepseq-1.3.0.0 ... linking ... done.
Loading package containers-0.4.2.1 ... linking ... done.
Loading package pretty-1.1.1.0 ... linking ... done.
Loading package template-haskell ... linking ... done.
Linking Main ...
¿Por qué ghc carga todos estos paquetes cuando Template Haskell está habilitado? Cada vez que construyo un programa que utiliza Template Haskell, especialmente uno que está construido contra una gran cantidad de paquetes, mis advertencias de compilación son abrumadas con estos mensajes superfluos de "Carga". Sería bueno si pudiera evitar que se impriman los mensajes, o detener la carga del módulo (¿innecesario?).
'Language.Haskell.TH' está en el paquete' template-haskell', que a su vez depende de todos los demás unos. Duh. –
Plantilla Haskell realiza una evaluación en tiempo de compilación, por lo que los módulos y paquetes que se necesitan para ejecutar el código empalmado en tiempo de compilación deben cargarse. – kosmikus