如果代码包含模块定义,为什么我不能用GHC编译?

我试图用ghc编译一个非常小的haskell代码:

module Comma where

import System.IO

main = do  
    contents <- getContents  
    putStr (comma contents)  

comma input = 
  let allLines = lines input
      addcomma [x]    =   x
      addcomma (x:xs)   = x ++ "," ++ (addcomma xs)
      result = addcomma allLines
  in result

我用来编译的命令是:

ghc - 制作Comma.hs

我得到这个答案:

[1 of 1]编译逗号(Comma.hs,Comma.o)

没有文件生成,并且没有警告或错误消息。

如果我从代码中注释“模块逗号”行,它会正确编译:

[1的1]编译主(Comma.hs,Comma.o)链接逗号...

我不明白发生了什么事。 我使用ghc 7,4,1(Glasgow Haskell编译器,版本7.4.1,第2阶段由GHC版本7.4.1启动)和ubuntu linux。

我很感激,如果有人能说出为什么不用模块定义进行编译


GHC将Main.main函数编译为可执行文件的入口点。 当您省略模块声明时, Module Main where将为您隐式插入。

但是,当你明确地命名它以外的Main ghc没有找到入口点。

我通常的工作流程是使用ghci (或ghci + emacs)代替这些代码片段,让您完全绕过这个问题。 或者,您可以使用-main-is Comma编译来明确告诉ghc使用逗号模块。


没有文件生成

你确定? 我期望至少可以生成Comma.oComma.hi 。 前者包含已编译好的代码,可以将其链接到可执行文件中,后者包含ghc用于对导入模块Comma的模块进行类型检查的接口信息。

但是,如果有主函数,ghc只会将编译后的模块链接到可执行文件中。 默认情况下,这意味着一个名为功能main名为模块中的Main 。 如果你没有放置明确的模块名称,则假定名称为Main ,这就是为什么当你删除module Comma where line时你的测试工作。

要编译和链接Comma.hs文件,您可以使用module Main where而不是module Comma where ,或者可以使用Comma.main -main-is标志告诉ghc Comma.main将成为主要功能:

ghc --make -main-is Comma Comma.hs

要么:

ghc --make -main-is Comma.main Comma.hs

如果你在你的文件中有一个main定义,并且你想将它编译成一个可执行文件,你只需要在module Main where

链接地址: http://www.djcxy.com/p/43401.html

上一篇: Why i can't compile with GHC if code contain module definition?

下一篇: Building with runtime flags using cabal and ghc