【问题标题】:GHC claims module only available as a boot module when it shouldn't beGHC 声明模块仅在不应该用作引导模块时才可用
【发布时间】: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 不是MainACE(但不是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.

标签: haskell ghc


【解决方案1】:

实际的问题是 ACE 和 GSI.Value 具有循环依赖关系:

ACE -> GSI.Value -> GSI.Thread -> GSI.Eval -> ACE

这是一个无法解决的问题,因为 ACE 在模板 Haskell 拼接中使用了来自 GSI.Value 的函数。这需要 GHC 动态加载 GSI.Value 才能编译 ACE;但这显然是不可能的。

解决方案是将 Thread 类型从 GSI.Thread 中移出,并移至可以避免对 GSI.Eval 或 GS​​I.Value 的任何依赖的单独模块。

【讨论】:

    猜你喜欢
    • 2021-11-04
    • 1970-01-01
    • 2015-08-11
    • 2019-04-18
    • 2020-07-02
    • 2020-08-14
    • 1970-01-01
    • 2017-10-30
    • 2020-12-17
    相关资源
    最近更新 更多