在 Haskell 中写或不写 `module Main where`

Posted

技术标签:

【中文标题】在 Haskell 中写或不写 `module Main where`【英文标题】:To write or not to write `module Main where` in Haskell 【发布时间】:2012-06-22 03:58:20 【问题描述】:

Haskell 98 规范规定程序的入口点,即函数main,按照惯例应该驻留在名为 Main 的模块中。但是,即使您没有在写入 main 的文件顶部写入 module Main where,源代码也会编译并且在您使用 GHC 时似乎可以正常工作。

问题是:

    module Main where和不写有什么区别? 首选哪一种?

【问题讨论】:

【参考方案1】:

没有真正的区别,module Main (main) where 将是您自己不指定标头时的隐式定义。来自Haskell 98 Report:

模块的缩写形式,仅由 模块主体,是允许的。如果使用它,则假定标题 成为module Main(main) where

我更喜欢明确的定义而不是隐含的定义,但是对于Main.hs,这是一个次要的偏好。

【讨论】:

不同的是,没有模块头,只导出main,但有module Main where,每个顶层定义都被导出。似乎您的眼睛看到了module Main(main) where 没有导出列表的地方;) 导出列表(main)很重要,因为这样可以让编译器进行更多优化。 @DanielFischer @augustss 我找不到任何支持这一点的文档。 GHC 在构建可执行文件时似乎没有做出这种区分。它似乎对module Main(main) wheremodule Main where 做同样的优化和链接。 关于出口行为,参见。 haskell.org/onlinereport/haskell2010/… 和之前的段落。关于优化,如果只导出main,编译器可以通过内联消除所有其他定义,如果这看起来不错的话。如果Main 中的其他定义也被导出,它们的符号必须在目标文件中生成。编译器可能仍然优化main,就像只导出main一样,但它也可能减少内联,因为这会重复太多代码。 @DanielFischer 谢谢。稍微戳一下ghc --show-iface,这一切都说得通。

以上是关于在 Haskell 中写或不写 `module Main where`的主要内容,如果未能解决你的问题,请参考以下文章

aegisub

python定义类()中写object和不写的区别

python定义类()中写object和不写的区别

在存储过程中写SET XACT_ABORT ON 有什么用,不写会发生什么问题

mybatis 中 映射文件 不写 resultType和parameterType,直接在 dao层 方法中写上参数和返回值 就可以?

惯用高效的 Haskell 追加?