我试图用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
复制相似问题