使用 WinGHCi 解析预制代码时出现错误

Parsing error on premade code with WinGHCi

我刚刚下载了完整的 Haskell 平台并从我的老师那里输入了一些代码来尝试破解,但结果它(或其他东西)已经被破解了,因为当我评估 main 表达式出现解析错误。

data Shape = Circle Double | Rect Double Double
area :: Shape -> Double
area (Circle radius) = 3.1415 * radius * radius
area (Rect width height) = width * height

错误

<interactive>:17:56: error: parse error on input ‘::’

我的安装有问题吗?我是 运行 版本 8.2.2

编辑:这是直接从 WinGHCi window

中逐字复制粘贴的错误
GHCi, version 8.2.2: http://www.haskell.org/ghc/  :? for help
Prelude> data Shape = Circle Double | Rect Double Double
area :: Shape -> Double
area (Circle radius) = 3.1415 * radius * radius
area (Rect width height) = width * height

<interactive>:7:54: error: parse error on input ‘::’

GHCi 是一个 Read Eval Print Loop (REPL),因此它会在输入时评估每一行。另一方面,area 是一个多行表达式,因此如果您尝试逐行输入它,它将因不完整而失败。

不过,您可以在 GHCi 中输入多行表达式。你需要做的是进入'multiline mode',输入你的行,然后再次退出多行模式。您可以使用 :{ 启动此编辑模式,然后使用 :} 再次关闭它。这是一个完整的例子:

Prelude> data Shape = Circle Double | Rect Double Double
Prelude> :{
Prelude| area :: Shape -> Double
Prelude| area (Circle radius) = 3.1415 * radius * radius
Prelude| area (Rect width height) = width * height
Prelude| :}
Prelude> area $ Circle 1.1
3.8012150000000005
Prelude> area $ Rect 1.2 3.4
4.08

如你所见,Shape的定义已经是单行了,所以那个阶段我觉得没有必要进入多行模式。但是,在输入 area 的定义时,需要使用 :{:}.

不过,一般来说,GHCi 用于实验和快速反馈。您应该在 .hs 文件中编写 Haskell 源代码,通常使用 Stack or Cabal 作为项目系统。