2012-07-10 104 views
7

我有打印當前模塊的名稱一個簡單的模板哈斯克爾程序(主程序,這裏):爲什麼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 ... 

當模板Haskell啓用時,爲什麼ghc加載所有這些包?每當我構建一個使用Haskell模板的程序,特別是針對大量程序包構建的程序時,我的編譯警告會被這些多餘的「加載」消息所淹沒。如果我可以停止打印消息,或停止(不必要的)模塊加載發生,那將會很好。

+0

'Language.Haskell.TH'在包'template-haskell'中,而該包又取決於所有其他那些。咄。 – 2012-07-10 21:52:21

+0

模板Haskell執行編譯時評估,因此必須加載運行在編譯時拼接的代碼所需的模塊和包。 – kosmikus 2012-07-10 21:52:57

回答

7

模板Haskell通過字節碼解釋器(GHCi)在編譯時運行。在編譯時你所擁有的任何軟件包依賴關係都會在編譯時動態加載到GHC中,以便執行拼接。

您的一個依賴項是模板Haskell庫本身,而這依賴於大部分核心內容。

4

通過將-v0標誌傳遞給GHC,可以防止打印「加載包」行。 (這也抑制了「編譯」和「連接」行,但仍然顯示警告和錯誤。)