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

Pte*_*mys 23 haskell module entry-point

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

问题是:

  1. 写作module Main where和不写作有什么区别?
  2. 哪一个更受欢迎?

jde*_*eno 21

module Main (main) where当您没有自己指定标题时,没有真正的区别,是隐式定义.来自Haskell 98报告:

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

我更喜欢隐式定义的明确定义,但是,Main.hs它是次要的偏好.

  • 不同之处在于没有模块标题,只导出`main`,但使用`module Main where`导出每个顶级定义.似乎你的眼睛看到`模块主(主)哪里`没有出口清单;) (8认同)
  • 导出列表`(main)`非常重要,因为这样可以让编译器进行更多优化. (4认同)
  • 关于出口行为,参见 http://www.haskell.org/onlinereport/haskell2010/haskellch5.html#x11-1000005.2以及之前的段落.关于优化,如果仅导出`main`,编译器可以通过内联来消除所有其他定义,如果这似乎是好的.如果"Main"中的其他定义也被导出,则必须在目标文件中生成它们的符号.编译器_may_仍然优化`main`就像只导出`main`一样,但它也可以做更少的内联,因为这会复制太多的代码. (3认同)
  • @DanielFischer 谢谢。稍微用一下“ghc --show-iface”,一切就都有意义了。 (2认同)