我在通过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 xrem
2 == 0"之外,这就是问题所在:
压痕很重要!
这一行(在引号内(不起作用"如果 xrem
2 == 0"。 这条线确实有效"如果 xrem
2 == 0"!
缩进一个空格是成功与失败的区别。
我对哈斯克尔完全陌生。我用PHP,Javascript和Applescript进行了广泛的编程,并涉足了其他十几个,这是我第一次看到空白问题。我认为这在Haskell退伍军人中是众所周知的,但如果它被突出显示在文档中,那肯定会很好。