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

jav*_*ier 6 haskell compiler-errors 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
Run Code Online (Sandbox Code Playgroud)

我用来编译的命令是:

ghc --make Comma.hs

我得到了这个答案:

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

没有生成文件,也没有警告或错误消息.

如果我从代码正确编译的"模块逗号在哪里"注释:

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

我不明白发生了什么.我正在使用ghc 7,4,1(格拉斯哥Haskell编译器,版本7.4.1,由GHC版本7.4.1启动的第2阶段)和ubuntu linux.

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

Dan*_*zer 10

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

但是当你明确地命名它时,Mainghc 以外的东西找不到入口点.

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


Tox*_*ris 5

没有生成文件

你确定吗?我希望至少Comma.oComma.hi生成.前者包含准备链接到可执行文件的已编译代码,后者包含ghc用于检查导入模块的模块的接口信息Comma.

但是,如果存在main函数,ghc将仅已编译的模块链接到可执行文件中.默认情况下,这意味着在名为main的模块中命名的函数Main.如果未放置显式模块名称,Main则会假定名称,这就是删除module Comma where行时测试的原因.

要编译和链接Comma.hs文件,您可以使用module Main where来代替module Comma where,或者您可以使用-main-is标志告诉GHC那Comma.main是要主要功能:

ghc --make -main-is Comma Comma.hs
Run Code Online (Sandbox Code Playgroud)

要么:

ghc --make -main-is Comma.main Comma.hs
Run Code Online (Sandbox Code Playgroud)


Die*_*lan 1

如果main您的文件中有一个定义并且您想将其编译为可执行文件,则您只需要module Main where.