为什么我在Haskell中的代码在命令行上工作,而不在文件中工作

时间:2016-09-05 18:31:40

标签: haskell ghci

我有以下代码在命令行上运行良好:

ghci> [let square x = x * x in (square 5, square 3, square 2)]
[(25,9,4)]

但是当我把它放在一个文件中并编译它时,它就不起作用了,我得到一个错误:

[1 of 1] Compiling Main             ( baby.hs, interpreted )

baby.hs:62:1:
    Parse error: naked expression at top level
    Perhaps you intended to use TemplateHaskell
Failed, modules loaded: none.

2 个答案:

答案 0 :(得分:6)

REPL GHCi接受Haskell表达式。与Python不同,Haskell模块必须由声明组成。

例如,表达式可以是1+1,但即使从人类角度来看,作为源文件的顶层也没有意义 - 没有声明变量并且没有执行任何操作。在顶层,您可以声明一个值,例如:

val = [let square x = x * x in (square 5, square 3, square 2)]

或者在REPL中,您可以使用let

执行相同操作
let val = [let square x = x * x in (square 5, square 3, square 2)]

答案 1 :(得分:3)

haskell模块(即源文件)通常包含some_var = expression形式的声明。该行将评估表达式(lazilly),并将其(“绑定”它)分配给变量some_var。如果您只是单独放置一个表达式(“裸表达式”),编译器就不知道如何处理它。所以你需要将它绑定到某个变量或用它做其他事情。例如,以下内容将完成:

sumSqaures = [let square x = x * x in (square 5, square 3, square 2)]

现在,这不是一个非常有用的模块,事实上,如果您尝试将其编译为可执行文件(而不是库),它将失败。这是因为可执行文件应该定义一个名为main的变量。所以如果你想要一个可以编译的完整程序,你可以试试这个

main = print sumSqaures

sumSqaures = [let square x = x * x in (square 5, square 3, square 2)]

甚至只是

main = print [let square x = x * x in (square 5, square 3, square 2)]