2012-07-10 9 views
7

Ho un programma Haskell banale modello che stampa il nome del modulo corrente (Main, qui):Perché TemplateHaskell fa in modo che GHC carichi i pacchetti?

{-# 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 

Quando compilo questo, ho il carico successivo messaggi da 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 ... 

Perché ghc carica tutti questi pacchetti quando Template Haskell è abilitato? Ogni volta che costruisco un programma che usa Template Haskell, specialmente uno che è costruito su molti pacchetti, i miei avvisi di compilazione sono sopraffatti da questi superflui messaggi di "Caricamento". Sarebbe bello se potessi impedire che i messaggi vengano stampati, o interrompere il caricamento del modulo (inutile?) A tutti.

+0

'Language.Haskell.TH' è nel pacchetto' template-haskell', che a sua volta dipende da tutti gli altri quelli. Duh. –

+0

Modello Haskell esegue la valutazione in fase di compilazione, quindi è necessario caricare i moduli e i pacchetti necessari per eseguire il codice giuntato in fase di compilazione. – kosmikus

risposta

7

Modello Haskell viene eseguito in fase di compilazione, tramite un interprete bytecode (GHCi). Tutte le dipendenze dei pacchetti che hai - in fase di compilazione - saranno caricate dinamicamente in GHC - in fase di compilazione, in modo che tu possa eseguire le giunzioni.

Una delle vostre dipendenze è la libreria Template Haskell stessa, che a sua volta dipende dalla maggior parte delle cose principali.

4

È possibile impedire la stampa delle righe "Caricamento pacchetto" passando il flag -v0 su GHC. (Questo sopprime anche le linee "Compilazione" e "Collegamento", ma gli avvisi e gli errori sono ancora visualizzati.)

Problemi correlati