2012-07-10 3 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 ... 

Template Haskell을 사용할 때 ghc가 모든 패키지를로드하는 이유는 무엇입니까? 템플릿 Haskell을 사용하는 프로그램, 특히 많은 패키지에 대해 빌드 된 프로그램을 빌드 할 때마다 필자의 컴파일 경고는 이러한 불필요한 "로드 중"메시지로 압도됩니다. 메시지가 인쇄되는 것을 멈추게하거나, (불필요한?) 모듈 로딩이 전혀 일어나지 않게하면 좋을 것입니다.

+0

'Language.Haskell.TH'는'template-haskell' 패키지에 있습니다. 사람. 이봐. –

+0

Haskell 템플릿은 컴파일시 평가를 수행하므로 컴파일시에 접합 된 코드를 실행하는 데 필요한 모듈과 패키지를로드해야합니다. – kosmikus

답변

7

템플릿 하스켈은 바이트 코드 인터프리터 (GHCi)를 통해 컴파일 타임에 실행됩니다. 컴파일 타임에 가지고있는 패키지 종속성은 컴파일 타임에 GHC에 동적으로로드되어 스플 라이스를 실행할 수 있습니다.

종속 관계 중 하나는 Template Haskell 라이브러리 자체이며 대부분 핵심적인 것들에 의존합니다.

4

-v0 플래그를 GHC로 전달하여 "패키지로드 중"행이 인쇄되지 않도록 할 수 있습니다. (이것은 또한 "Compiling"과 "Linking"줄을 없애지 만, 경고와 에러는 여전히 보여집니다.)