Haskell:解析错误:模块头,导入声明或期望的顶级声明

Ste*_*3p0 8 haskell compiler-errors

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

fst (1,2)
snd (1,2)
Run Code Online (Sandbox Code Playgroud)

当我从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.
Run Code Online (Sandbox Code Playgroud)

我用谷歌搜索了这个错误,无法找到任何解释我做错了什么.

mel*_*ene 14

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

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

main =
    print (fst (1,2)) >>
    print (snd (1,2))
Run Code Online (Sandbox Code Playgroud)

  • 我期望发生什么???我是 Haskell 的新手!!!stackoverflow 上的人可能很粗鲁。 (53认同)
  • 这个答案确实有点粗鲁和无情。来自 Python 的用户可以非常合理地期望只运行一个文件并让它执行。 (21认同)
  • 我没有任何期望。我认为我在 prelude 中输入的语句也可以按原样包含在 .hs Haskell 脚本中。在 Graham Hutton 所著的教科书“Haskell 编程”的前四章中,没有提到(我能找到的)关于 main 声明的内容。谢谢你的帮助。 (8认同)
  • @SteveB 这是一个真正的问题。你*期望*会发生什么? (3认同)

Lou*_*ell 9

从新手到未来新手:交互式环境ghci会让您相信您可以将一些表达式打入.hs文件并运行(与swift和ruby等语言类似).不是这种情况.

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

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

main :: IO ()
main =  do c <- getChar
           putChar c
Run Code Online (Sandbox Code Playgroud)

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

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

  • 也许大多数编写过的 haskell 代码从未运行过;) (5认同)
  • 我仍然无法理解为什么我找不到任何书籍、教程或任何其他资源可以说一些简单的内容,例如“从命令提示符/shell 运行脚本,将程序逻辑放在 main = do ...”中。然而这里的答案已经说明了这一点,而且现在可行了。谢谢。 (3认同)