在 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) where
和module Main where
做同样的优化和链接。
关于出口行为,参见。 haskell.org/onlinereport/haskell2010/… 和之前的段落。关于优化,如果只导出main
,编译器可以通过内联消除所有其他定义,如果这看起来不错的话。如果Main
中的其他定义也被导出,它们的符号必须在目标文件中生成。编译器可能仍然优化main
,就像只导出main
一样,但它也可能减少内联,因为这会重复太多代码。
@DanielFischer 谢谢。稍微戳一下ghc --show-iface
,这一切都说得通。以上是关于在 Haskell 中写或不写 `module Main where`的主要内容,如果未能解决你的问题,请参考以下文章
在存储过程中写SET XACT_ABORT ON 有什么用,不写会发生什么问题
mybatis 中 映射文件 不写 resultType和parameterType,直接在 dao层 方法中写上参数和返回值 就可以?