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使用逗号模块.
没有生成文件
你确定吗?我希望至少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
Run Code Online (Sandbox Code Playgroud)
要么:
ghc --make -main-is Comma.main Comma.hs
Run Code Online (Sandbox Code Playgroud)