6

我正在尝试用 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 --make Comma.hs

我得到了这个答案:

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

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

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

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

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

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

4

3 回答 3

10

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

但是,当您明确将其命名为Mainghc 以外的其他名称时,找不到入口点。

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

于 2013-07-26T18:16:33.950 回答
5

没有生成文件

你确定吗?我希望至少Comma.o并且Comma.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

或者:

ghc --make -main-is Comma.main Comma.hs
于 2013-07-26T20:51:33.840 回答
1

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

于 2013-07-26T18:15:17.570 回答