首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果代码包含模块定义,我为什么不能用GHC编译?

如果代码包含模块定义,我为什么不能用GHC编译?
EN

Stack Overflow用户
提问于 2013-07-26 18:10:39
回答 3查看 2.6K关注 0票数 6

我试图用ghc编译一个非常小的haskell代码:

代码语言:javascript
运行
复制
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。

如果有人能告诉我为什么不使用模块定义进行编译,我很感激

EN

回答 3

Stack Overflow用户

发布于 2013-07-26 18:16:33

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

但是,当您显式地命名它时,除了Main之外,ghc不会找到一个入口点。

我通常的工作流程是使用ghci (或ghci + emacs)代替这些代码段,让我们完全绕过这个问题。或者,您可以使用-main-is Comma进行编译,显式地告诉ghc使用逗号模块。

票数 10
EN

Stack Overflow用户

发布于 2013-07-26 20:51:33

不生成任何文件。

真的吗?我希望至少生成Comma.oComma.hi。前者包含准备链接到可执行文件中的编译代码,后者包含ghc用于导入模块Comma的打字机模块的接口信息。

但是,如果有主函数,则ghc只会将已编译的模块链接到一个可执行文件中。默认情况下,这意味着名为main的函数位于名为Main的模块中。如果不使用显式模块名,则使用Main名称,这就是为什么删除module Comma where行时测试工作正常的原因。

要编译和链接Comma.hs文件,可以使用module Main where而不是module Comma where,也可以使用-main-is标志告诉ghc Comma.main是主要函数:

代码语言:javascript
运行
复制
ghc --make -main-is Comma Comma.hs

或者:

代码语言:javascript
运行
复制
ghc --make -main-is Comma.main Comma.hs
票数 5
EN

Stack Overflow用户

发布于 2013-07-26 18:15:17

如果文件中有main定义,并且希望将其编译为可执行文件,则只能具有module Main where

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17888158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档