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.
'Language.Haskell.TH' è nel pacchetto' template-haskell', che a sua volta dipende da tutti gli altri quelli. Duh. –
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