Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Haskell中写入或不写入'module Main where'_Haskell_Module_Entry Point - Fatal编程技术网

在Haskell中写入或不写入'module Main where'

在Haskell中写入或不写入'module Main where',haskell,module,entry-point,Haskell,Module,Entry Point,Haskell 98规范指出,按照惯例,程序的入口点,即函数main,应该位于名为main的模块中。但是,即使您没有将module Main where写入您写入的Main文件的顶部,当您使用GHC时,源代码也会编译并正常工作 问题是: 写入模块Main where与不写入有什么区别 哪一个比较好 实际上没有什么区别,modulemain(Main),其中当您自己不指定头时,将是隐式定义。从: 模块的缩写形式,仅包括 允许使用模块体。如果使用此选项,则假定为标题 将成为模块主(主),其中 与隐式

Haskell 98规范指出,按照惯例,程序的入口点,即函数
main
,应该位于名为main的模块中。但是,即使您没有将
module Main where
写入您写入的
Main
文件的顶部,当您使用GHC时,源代码也会编译并正常工作

问题是:

  • 写入
    模块Main where
    与不写入有什么区别
  • 哪一个比较好

  • 实际上没有什么区别,
    modulemain(Main),其中当您自己不指定头时,
    将是隐式定义。从:

    模块的缩写形式,仅包括 允许使用模块体。如果使用此选项,则假定为标题 将成为模块主(主),其中


    与隐式定义相比,我更喜欢显式定义,但对于
    Main.hs
    而言,这是一个次要的偏好

    不同之处在于,如果没有模块标题,则仅导出
    main
    ,而使用
    module main,则导出每个顶级定义。您的眼睛似乎看到了
    模块Main(Main),其中没有导出列表;)有导出列表
    (main)
    ,这一点很重要,因为这允许编译器进行更多优化。@DanielFischer@augustss我找不到任何文档支持这一点。在构建可执行文件时,GHC似乎没有做出这种区分;它似乎对
    模块Main(Main)where
    进行了与
    模块Main where
    相同的优化和链接。关于导出行为,请参见前面的段落。关于优化,如果仅导出
    main
    ,编译器可以通过内联消除所有其他定义(如果这看起来不错)。如果还导出了
    Main
    中的其他定义,则必须在对象文件中生成这些定义的符号。编译器仍然可以优化
    main
    ,就像只导出
    main
    一样,但它也可以减少内联,因为这样会复制太多的代码。@danielfisher,谢谢。稍微拨弄一下ghc——显示iface,这一切都是有意义的。