Haskell中函数'main'未定义?

3

这是我的基本程序,但是它显示模块'Main'中未定义函数'main',我该如何解决?

以下是我的程序:

main = do
-- variable
a <- getLine
putStrLn a

2
您缺少缩进。 - Thomas M. DuBuisson
2
你必须将两行代码 a <- getLineputStrLn a 缩进相同的距离。 - Daniel Fischer
2
虽然没有缩进,但您应该会收到一个解析错误。 - Daniel Fischer
2
看起来你使用了制表符,这里的代码显示可能会误导。是这样吗? - Daniel Fischer
3
因为默认情况下启用了 NondecreasingIndentation(自 GHC 7.2 起称为该名称),这是一种已知的、有意为之的与标准不同之处(与其他一些不同之处不同,我不喜欢它),我刚刚发现。使用 -XHaskell2010-XNoNondecreasingIndentation [ghc >= 7.2] 将会导致解析错误。 - Daniel Fischer
显示剩余3条评论
2个回答

6

您的代码缺少缩进,Haskell使用缩进来确定块的结束。

main = do
    a <- getLine
    putStrLn a

以下是您代码的正确缩进形式;您可能需要阅读这里的文章,该文章比我解释得更好。

我认为这是由于OP使用制表符造成的瑕疵。 - Daniel Fischer
1
是的,如果那种格式真实存在,它应该会产生解析错误(只有 GHC 不会产生错误,它会接受这段代码,需要检查是否是故意的)。 - Daniel Fischer
当我运行这个程序时,我的GHCI副本会出现错误消息,而纯粹的GHC也会崩溃。 - Ovar Feisyl
这是哪个版本?(我需要-XNoNondecreasingIndentation-XHaskell2010来使它在do块中的缩进方面符合标准。) - Daniel Fischer
抱歉,我在浏览时迷失了方向。我的 GHC(I) 版本是 7.4.2,安装自 Haskell 平台,没有特殊选项。我使用的是 Win32 系统,这可能是由于不同的配置引起的吗? - Ovar Feisyl
显示剩余2条评论

1
这个错误信息简单地意味着编译器没有找到您的函数 main 的定义。
要运行已编译的程序,而不是在 ghci 中与其交互(这对于初学者来说是我推荐的),您需要 main::IO ()
如果您不给模块命名,则它会自动执行等同于在文件顶部插入 module Main where 的操作。
我想不出任何其他产生此错误的方法,除非:
  • 意外用--{-另一种注释语法-}注释掉了main
  • 拼写单词main错误
  • 意外编译一个空文件。

尽管您的问题似乎显示了不正确的缩进,但这是因为此网站将制表符视为8个字符宽。我怀疑您缩进 main 四个空格以使其在问题中格式化为代码。无论如何,编译器没有给出与缩进错误一致的错误消息。
我建议您使用空格而不是制表符进行缩进,因为调试程序的空白非常令人恼火。
大多数编辑器都可以配置为将制表符键转换为适当数量的空格,从而使您具有相同的对齐功能,而无需进行字符计数差异。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接