使用列表定义加载文件时Haskell解析错误

Ree*_*rds 1 haskell list

我猜这是一个初学者错误.我写了一个hs文件

let mylist = [1,2,3]
Run Code Online (Sandbox Code Playgroud)

当我运行它使用:加载ghci我得到以下错误

解析错误(可能是错误的缩进)

当我处于Prelude模式时,该语句有效.所以基本上我想知道为什么加载文件时这不起作用,Prelude和Main之间有什么区别?

ham*_*mar 7

在GHCi中,语法有点不同,因为它有点像你在do-block中,所以你必须使用let x = ...表单.在Haskell源文件中,您只需删除let并写入:

mylist = [1,2,3]
Run Code Online (Sandbox Code Playgroud)

至于Prelude和之间的区别Main,它Prelude是一个标准模块,它定义了最常见的Haskell类型和函数,默认情况下它被导入到每个Haskell模块中.

Main只是module Foo where ...顶部没有的模块的默认名称.

将GHCi与默认设置一起使用时,提示会显示当前哪些模块在范围内.如果您刚刚启动GHCi而没有加载文件,这将只是Prelude,所以提示符如下所示:

Prelude>
Run Code Online (Sandbox Code Playgroud)

加载模块后,提示符将更改为显示已进入作用域的新模块.如前所述,Main如果你没有给它一个不同的名字,那将是这样.

*Main>
Run Code Online (Sandbox Code Playgroud)

星号表示模块已在解释模式下加载,这意味着模块中范围内的所有内容也将在GHCi提示符的范围内,包括从其他模块(例如Prelude.)导入的内容.

您可以使用该:m命令将其他模块放入范围.请注意提示如何更改以显示其他模块.

*Main> :m + Data.List
*Main Data.List> 
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请键入:helpGHCi或阅读GHC用户指南的GHCi章节.