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

时间:2012-01-24 19:17:05

标签: list haskell

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

let mylist = [1,2,3]

当我运行它时:在ghci中加载我得到以下错误

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

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

1 个答案:

答案 0 :(得分:7)

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

mylist = [1,2,3]

至于PreludeMain之间的差异,Preludedefines the most common Haskell types and functions的标准模块,默认情况下会导入每个Haskell模块。

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

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

Prelude>

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

*Main>

星号表示模块已在解释模式下加载,这意味着模块中范围内的所有内容也将在GHCi提示符的范围内,包括从{{1}等其他模块导入的内容}。

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

:m

有关详情,请在GHCi或read the GHCi chapter of the GHC User's Guide中输入*Main> :m + Data.List *Main Data.List>