2012-07-10 16 views
7

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?).

+0

'Language.Haskell.TH' está en el paquete' template-haskell', que a su vez depende de todos los demás unos. Duh. –

+0

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

Respuesta

7

Plantilla Haskell se ejecuta en tiempo de compilación, a través de un intérprete de código de bytes (GHCi). Cualquier dependencia de paquete que tenga, en tiempo de compilación, se cargará dinámicamente en GHC, en tiempo de compilación, para que pueda ejecutar sus empalmes.

Una de sus dependencias es la biblioteca de Template Haskell en sí misma, que a su vez depende de la mayoría de las cosas centrales.

4

Puede evitar que las líneas "Cargando paquete" se impriman pasando el indicador -v0 a GHC. (Esto también suprime las líneas "Compilar" y "Enlazar", pero las advertencias y los errores todavía se muestran).

Cuestiones relacionadas