使GHC接受带有非IO()的main函数的主模块。

4

有没有一种方法(标志或技巧)可以使 GHC 接受一个主模块,其中主函数的签名不是 IO ()?对于 Fay,主函数的类型为 Fay (),但如果模块是 Main(或模块名称被省略),GHC 将不接受它。


这个程序应该解决什么问题?您是否担心安全性? - J Fritsch
1
问题在于我们使用 GHC 进行类型检查,这很好,除了 Main.main 的情况,因为我们使用类型 Fay(),而不是 IO monad。 - Adam Bergmark
11
您可以插入 dummy :: IO() 并使用 -main-is Main.dummy 编译。这将使主函数成为一个无操作的函数,并成功编译。 - Daniel Fischer
1
也许你甚至不需要插入虚拟模块,如果你使用类似于-main-is Some.Completely.Different.Dummy.Module这样的东西? - Ørjan Johansen
@ØrjanJohansen 不错,听起来完美!我会试一下的。 - Adam Bergmark
1
抱歉测试慢了。@DanielFischer和Ørjan Johansen,这个完美地解决了问题,谢谢!请添加答案以便我接受它!不确定该奖励答案给谁 :) - Adam Bergmark
1个回答

10

该程序的入口点必须具有某个类型 IO a,据我所知,没有办法使 GHC 接受其他类型(而不修改其源代码)。

默认情况下,入口点是 Main.main,但是您可以使用 GHC 的 -main-is 标志指定不同的操作作为入口点。一般形式如下:

ghc -main-is Module.action ModuleThatImportsEverything.hs -o programme
你可以省略Module部分,如果模块是Main
ghc -main-is action ModuleThatImportsEverything.hs -o programme

对于action部分,如果它的名称是main

ghc -main-is Module ModuleThatImportsEverything.hs -o programme

等价于 -main-is Module.main

对于您的情况,您可以向 Main 模块添加一个虚拟操作,或添加一个虚拟模块 - 当然需要从程序中导入(直接或间接)到 Main 模块 - 以在 GHC 看来作为入口点。


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