如果代码包含模块定义,为什么我不能用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.o
和Comma.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
。
上一篇: Why i can't compile with GHC if code contain module definition?