2012-07-10 7 views
7

私は(ここではメイン、)現在のモジュールの名前を出力些細なテンプレート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"メッセージで圧倒されます。メッセージが印刷されるのを止めるか、(不要な)モジュールの読み込みがまったく起こらないようにするといいでしょう。

+0

'Language.Haskell.TH'は' template-haskell'パッケージに含まれています。もの。ダー。 –

+0

テンプレートHaskellはコンパイル時に評価を行うため、コンパイル時にスプライスされたコードを実行するために必要なモジュールとパッケージをロードする必要があります。 – kosmikus

答えて

7

テンプレートHaskellは、コンパイル時に、バイトコードインタープリタ(GHCi)を介して実行されます。コンパイル時にあなたが持っているパッケージの依存関係はコンパイル時に動的にGHCにロードされ、スプライスを実行することができます。

あなたの依存関係の1つはTemplate Haskellライブラリそのものです。これは、ほとんどの中核事項に依存します。

4

-v0フラグをGHCに渡すことで、「パッケージの読み込み」行が印刷されないようにすることができます。 (これは "Compiling"と "Linking"の行を抑制しますが、警告とエラーはまだ表示されます)

関連する問題