为什么TemplateHaskell导致GHC加载包?

tsu*_*aan 7 haskell template-haskell

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

{-# 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
Run Code Online (Sandbox Code Playgroud)

当我编译它时,我从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 ...
Run Code Online (Sandbox Code Playgroud)

为什么ghc在启用Template Haskell时加载所有这些包?每当我建立使用模板哈斯克尔,尤指对很多包生成的程序,我编译警告疲于应付这些多余的"加载"的消息.如果我可以阻止打印消息,或者根本不停止(不必要的?)模块加载,那将是很好的.

Don*_*art 7

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

您的一个依赖项是Template Haskell库本身,而后者依赖于大多数核心事物.