类型检查多个'Main's

Typechecking multiple 'Main's

我有一个 Haskell 库,其中包含几个可执行文件(测试、基准测试等),总共大约六个。当我在库中进行一些重构时,我通常需要对每个可执行文件进行一些小的更改。

在我当前的工作流程中,我分别编译每个可执行文件(例如,使用 GHCi)并修复每个文件。这很乏味,因为我必须输入每个可执行文件的路径,而且必须重新加载所有(非常大的)库,即使使用 GHCi 也需要一些时间。

我解决这个问题的第一个想法是创建一个导入可执行 "Main" 模块的虚拟模块。但是,这(当然)要求 "Main" 模块具有类似 module Executable1 where ... 的模块名称。但是现在 cabal 在编译可执行文件时抱怨找不到名为 "Main" 的模块(尽管在每个可执行文件的 cabal 文件中明确列出了 "main-is"。)

我也试过 ghci Exec1.hs Exec2.hs ...,但它抱怨 module ‘main@main:Main’ is defined in multiple files

有没有一种简单的方法可以使用 GHCi 一次加载多个 "Main" 模块,以便我可以同时对它们进行类型检查?

Cabal 的 main-is 选项只告诉 Cabal 它应该传递给 GHC 的文件名。 Cabal 不关心它的模块名称。

GHC 本身有一个标志,也称为 -main-isdocumented here,它告诉编译器哪个模块包含 main 函数。

所以这有效:

executable foo
  main-is: Foo.hs
  ghc-options: -main-is Foo

当然Foo.hs应该从module Foo where…开始,导出main。和往常一样,模块名和文件名需要匹配。

这样,所有可执行文件都可以有不同的模块名称,您可以将它们全部加载到 GHCi 中。

如果你还想更改主函数的名称,写ghc-options: -main-is Foo.fooMain。我猜你甚至可以让所有可执行文件都具有相同的 module 但不同的 main-functions 这种方式。