我试图用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我用来编译的命令是:
制造Comma.hs
我得到的答案是:
一个编译逗号中的一个( Comma.hs,Comma.o )
不生成任何文件,也没有警告或错误消息。
如果我注释代码中的“模块逗号”行,它将正确编译:
1编译主( Comma.hs,Comma.o )链接逗号。
我不明白发生了什么事。我使用ghc 7,4,1 (格拉斯哥Haskell编译器,版本7.4.1,阶段2由GHCVersion7.4.1引导)和ubuntu。
如果有人能告诉我为什么不使用模块定义进行编译,我很感激
发布于 2013-07-26 18:16:33
GHC将函数Main.main编译为可执行文件的入口点。当您省略模块声明时,将隐式地插入Module Main where。
但是,当您显式地命名它时,除了Main之外,ghc不会找到一个入口点。
我通常的工作流程是使用ghci (或ghci + emacs)代替这些代码段,让我们完全绕过这个问题。或者,您可以使用-main-is Comma进行编译,显式地告诉ghc使用逗号模块。
发布于 2013-07-26 20:51:33
不生成任何文件。
真的吗?我希望至少生成Comma.o和Comma.hi。前者包含准备链接到可执行文件中的编译代码,后者包含ghc用于导入模块Comma的打字机模块的接口信息。
但是,如果有主函数,则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-26 18:15:17
如果文件中有main定义,并且希望将其编译为可执行文件,则只能具有module Main where。
https://stackoverflow.com/questions/17888158
复制相似问题