多个“Main”的类型检查

4
我有一个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”模块,以便我可以同时对它们进行类型检查?
1个回答

7
Cabal的main-is选项只告诉Cabal应该将哪个文件名传递给GHC。Cabal不关心它的模块名称。
GHC本身有一个标志,也称为-main-is,在此处记录,它告诉编译器哪个模块包含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。我猜您甚至可以通过这种方式让所有可执行文件具有相同的 模块,但是具有不同的 main-函数

这将为我节省很多时间!谢谢! - crockeea
它是否按预期工作?我实际上没有测试过。 - Joachim Breitner
确实如此。注意事项:您的文件名必须与模块名称匹配,并且您必须导出“main”。 - crockeea
没错,但这通常是模块的情况,没有什么特别的。我会扩展答案。 - Joachim Breitner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接