【发布时间】:2016-11-16 11:28:30
【问题描述】:
我有这个依赖图(忽略对第三方模块的依赖):
Main:
GSI.Util
GSI.Value
GSI.Result
GSI.Eval
GSI.ByteCode
GSI.Thread
GSI.Main:
GSI.Value
GSI.ByteCode
GSI.Thread:
GSI.Util
GSI.RTS
GSI.Value
GSI.Result
GSI.Eval
GSI.Eval:
GSI.Util
GSI.RTS
GSI.Value
GSI.Result
ACE
GSI.Eval (.hs-boot):
GSI.Value
ACE:
GSI.RTS
GSI.Value
GSI.ByteCode
GSI.Result
{-# SOURCE #-} GSI.Eval
GSI.ByteCode:
GSI.Util
GSI.Value
{-# SOURCE #-} GSI.Thread
GSI.ByteCode (.hs-boot):
{-# SOURCE #-} GSI.Value
{-# SOURCE #-} GSI.Thread
GSI.Result:
GSI.Util
GSI.RTS
GSI.Value
GSI.Value:
GSI.Util
GSI.RTS
{-# SOURCE #-} GSI.ByteCode
(我想进一步缩小该图表,但老实说,我不知道哪些部分是相关的。未列出的 .hs-boot 文件对我的代码没有依赖关系)。当我这样做时
ghc --make Main.hs
我收到这条消息:
[10 of 13] Compiling ACE ( ACE.hs, ACE.o ) [GSI.ByteCode changed]
module GSI.Thread cannot be linked; it is only available as a boot module
到底是什么?我从 Main 导入 GSI.Thread 不是作为引导模块,那么 GHC 怎么能声称它只能作为引导模块使用呢? (而且,就此而言,为什么 GHC 不能只检测这种情况并自动包含非引导模块?)
【问题讨论】:
-
好吧,
ACE不是Main和ACE(但不是Main)与GSI.Thread一起参与了一个导入周期,所以这条消息似乎不合理。ACE中有一些模板 Haskell 或其他东西? -
@ReidBarton - 我完全不明白。您似乎知道此错误消息的含义 - 而 Google 不知道 - 所以也许您可以解释一下?我完全迷路了。
-
我真的不知道它是什么意思,除了它来自 ghci 链接器,所以你必须使用 Template Haskell 或类似的东西。
-
对。问题是 ACE 使用来自 GSI.Value 的 Template Haskell(一切都可以,它是错误报告所必需的)但 GSI.Value 依赖于(非本质上,只需要类型)GSI.ByteCode,它依赖于(非本质上,只需要类型)GSI 。线。嗯
-
我不知道 TH 依赖跟踪是如何工作的,但考虑到
GSI.Thread通过正常导入(通过GSI.Eval)导入ACE,它的代码在运行拼接时肯定不可用在ACE.