Haskell:解析错误:需要模块标头、导入声明或顶级声明



我在通过Haskell教科书工作时将Haskell脚本中的一些命令保存在.hs文件中。这里有一个小例子。

fst (1,2)
snd (1,2)

当我从 GHCi 的前奏中运行这些命令时,它们工作正常。当我尝试使用这两行编译 .hs 文件时,我得到以下内容:

ch4_test.hs:2:1: error:
Parse error: module header, import declaration
or top-level declaration expected.
|
2 | fst (1,2)
| ^^^^^^^^^
Failed, no modules loaded.

我已经用谷歌搜索了这个错误,但找不到任何解释我做错了什么。

从新手到未来的新手:交互环境ghci会让你相信你可以将一些表达式打入.hs文件中并运行它(以类似于 swift 和 ruby 等语言的方式(。事实并非如此。

Haskell需要一个名为main的入口点。引用:

这是一个简单的程序,用于读取然后打印一个字符:

main :: IO ()
main =  do c <- getChar
putChar c

名称 main 的使用很重要:main 被定义为 Haskell 程序的入口点(类似于 C 中的 main 函数(,并且必须具有 IO 类型,通常是 IO((

来源: https://www.haskell.org/tutorial/io.html

您不能只在 hs 文件中放置任何表达式。

正如错误消息所说,您需要在此处进行声明。例如:

main =
print (fst (1,2)) >>
print (snd (1,2))

我收到此错误,但原因似乎与此处发布的任何内容完全不同。而且错误消息根本没有帮助。

在MacOS High Sierra(10.13(上使用阴谋集团版本3.6.2.0和GHCI 8.10.7 我正在从这个页面工作:https://www.tutorialspoint.com/haskell/haskell_modules.htm 特别是"自定义模块"部分。在那里,您可以看到我复制和粘贴的代码。

除了教程没有提到我需要将"other-modules: Custom"添加到myfirstapp.cabal之外,除了示例Custom.hs文件包含"if x 'rem' 2 == 0"而不是"if xrem2 == 0"之外,这就是问题所在:

压痕很重要!

这一行(在引号内(不起作用"如果 xrem2 == 0"。 这条线确实有效"如果 xrem2 == 0"!

缩进一个空格是成功与失败的区别。

我对哈斯克尔完全陌生。我用PHP,Javascript和Applescript进行了广泛的编程,并涉足了其他十几个,这是我第一次看到空白问题。我认为这在Haskell退伍军人中是众所周知的,但如果它被突出显示在文档中,那肯定会很好。

最新更新