【问题标题】:Why does TemplateHaskell cause GHC to load packages?为什么 TemplateHaskell 会导致 GHC 加载包?
【发布时间】:2012-07-10 21:37:24
【问题描述】:

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

{-# 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 收到以下加载消息:

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 的程序时,尤其是针对大量包构建的程序时,我的编译警告都会被这些多余的“加载”消息所淹没。如果我可以停止打印消息,或者完全停止(不必要的?)模块加载,那就太好了。

【问题讨论】:

  • Language.Haskell.TH 在包template-haskell 中,这又取决于所有其他的。呵呵。
  • Template Haskell 执行编译时评估,因此必须加载运行在编译时拼接的代码所需的模块和包。

标签: haskell template-haskell


【解决方案1】:

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

您的依赖项之一是 Template Haskell 库本身,它又依赖于大多数核心内容。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-16
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      相关资源
      最近更新 更多