7

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

4

2 に答える 2

7

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

依存関係の 1 つは Template Haskell ライブラリ自体であり、これはほとんどのコアに依存しています。

于 2012-07-10T21:53:45.463 に答える
4

-v0フラグを GHCに渡すことで、「Loading package」行が出力されないようにすることができます。(これにより、「コンパイル中」と「リンク中」の行も抑制されますが、警告とエラーは引き続き表示されます。)

于 2012-07-11T07:53:08.407 に答える