私は(ここではメイン、)現在のモジュールの名前を出力些細なテンプレートHaskellのプログラムを持っている:なぜTemplateHaskellはGHCにパッケージを読み込ませますか?
{-# 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から次のロードメッセージを取得:
[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 ...
Template Haskellが有効になっているときにghcがこれらのパッケージをすべてロードするのはなぜですか? Template Haskellを使用するプログラム、特にたくさんのパッケージに対してビルドされたものをビルドするときは、私のコンパイル警告はこれらの余分な "Loading"メッセージで圧倒されます。メッセージが印刷されるのを止めるか、(不要な)モジュールの読み込みがまったく起こらないようにするといいでしょう。
'Language.Haskell.TH'は' template-haskell'パッケージに含まれています。もの。ダー。 –
テンプレートHaskellはコンパイル時に評価を行うため、コンパイル時にスプライスされたコードを実行するために必要なモジュールとパッケージをロードする必要があります。 – kosmikus