为什么TemplateHaskell会导致GHC加载包?

为什么TemplateHaskell会导致GHC加载包?,haskell,template-haskell,Haskell,Template Haskell,我有一个简单的模板Haskell程序,它打印当前模块的名称(Main,此处): 编译此文件时,我从ghc获得以下加载消息: 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 ... li

我有一个简单的模板Haskell程序,它打印当前模块的名称(Main,此处):

编译此文件时,我从ghc获得以下加载消息:

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 ...

为什么ghc在启用模板Haskell时加载所有这些包?每当我构建一个使用模板Haskell的程序,特别是一个针对许多包构建的程序时,我的编译警告都会被这些多余的“加载”消息淹没。如果我可以停止打印消息,或者完全停止(不必要的?)模块加载,那就太好了。

模板Haskell在编译时通过字节码解释器(GHCi)运行。您在编译时拥有的任何包依赖项都将在编译时动态加载到GHC中,以便您可以执行拼接


其中一个依赖项是模板Haskell库本身,它反过来又依赖于大多数核心内容

通过将
-v0
标志传递给GHC,可以防止打印“加载包”行。(这也会抑制“编译”和“链接”行,但仍会显示警告和错误。)

Language.Haskell.TH
位于包
模板Haskell
中,这反过来又取决于所有其他行。Template Haskell执行编译时评估,因此必须加载运行编译时拼接的代码所需的模块和包。
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 ...