Haskell:输入'putStrLn'出现解析错误。

8

我刚写了我的第一个Haskell程序,但是有一个错误我无法理解。我认为它是正确的,因为我只是像书上的例子一样写的。请问有谁能帮帮我吗?

main = do
    putStrLn "Hello, what's your name?"
    name <- getLine
    putStrLn ("Hey" ++ name ++ ", nice to meet you!")

错误信息为:

在输入 'putStrLn' 时出现解析错误

这很奇怪。

5
请检查您的空白字符,确保其中没有制表符(请参见例如 此问题)。 - hammar
哦天啊!非常感谢!它有效了!我觉得这可能有点棘手。 :D - Mel
顺便说一句:这看起来不像是完整的错误信息。 GHC 错误会有行号和列号。如果包含这些信息,对于人们(包括你自己)来说都会更容易处理,所以请确保始终包含完整的错误信息。 :-) - shachaf
大多数编辑器都允许用空格替换制表符。在编写Haskell或任何对空格敏感的语言时,打开此选项是一个好主意。 - Ralph
2
GHC 应该默认警告在源文件中发现任何制表符。 - leftaroundabout
1个回答

11

虽然从你发布的代码中无法得知,因为在SO上,至少有一些时候会将制表符转换为空格,但问题很可能是您在putStrLn之前输入了一个字面制表符而不是像您在do块的其他两行中一样使用四个空格,或者反之。

do块中的所有语句必须以完全相同的空格开始,而不仅仅是在视觉上对齐。如果您正在使用可以以特殊方式显示字面制表符的文本编辑器,请设置它以这样做;这将为您节省一些麻烦。


是的,那就是问题所在。我写的时候真没注意到这个。你的回答真的很有帮助。谢谢! - Mel
2
@Mel:实际上,在缩进多行时,您可以以各种组合混合使用制表符和空格;重要的是,在此[Haskell 报告](http://www.haskell.org/onlinereport/haskell2010/haskellch10.html#x17-17800010.3)中指定了制表符字符计为 8 个空格,而不是您似乎在编辑器中设置的 4 个空格。 - yatima2975

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