現在のモジュールの名前を出力する単純な Template Haskell プログラムがあります (ここではメイン)。
{-# 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
これをコンパイルすると、ghc から次の Loading メッセージが表示されます。
tsuraan@localhost ~/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 ...
Template Haskell が有効になっているときに ghc がこれらのパッケージをすべてロードするのはなぜですか? Template Haskell を使用するプログラム、特に多くのパッケージに対してビルドされたプログラムをビルドするときはいつでも、これらの余分な「読み込み中」メッセージでコンパイル警告が圧倒されます。メッセージが印刷されないようにするか、(不要な?) モジュールのロードがまったく行われないようにできればいいのですが。