格雷厄姆·赫顿 (Graham Hutton) 的“Haskell 编程”中的 Haskell 中的简单求和函数不起作用

use*_*779 2 haskell

在“用 Haskell 编程”中的第一个代码示例中,说明了以下内容:

回想本章前面使用的函数 sum,它产生一个数字列表的总和。在 Haskell 中,可以使用两个等式定义 sum:

sum [] = 0      
sum (n:ns) = n + sum ns
Run Code Online (Sandbox Code Playgroud)

立即,此代码在 ghci 解释器和编译时都失败,并显示错误:“函数 sum 中的非详尽模式”

经过进一步研究,这似乎是因为未涵盖单个数字的情况。让我吃惊的是书中接下来的几个例子也无法奏效。

我在这里错过了什么吗?这本书是最近在 2016 年发布的,我找不到其他人对此抱怨。

ths*_*ton 9

当您输入定义的第一个子句sum并按 Enter 时,GHCI 假定您已经完成并且应该评估程序。该程序

sum [] = 0
Run Code Online (Sandbox Code Playgroud)

如果参数非空,则不指定要执行的操作,因此您会收到“非穷举模式”错误。

GHCI 有:{:}命令允许您输入多个子句(或其他跨越多行的代码:

Prelude> :{
Prelude| sum [] = 0
Prelude| sum (n:ns) = n + sum ns
Prelude| :}
Prelude> sum []
0
Prelude> 
Run Code Online (Sandbox Code Playgroud)

一般来说,我建议将您正在使用的定义保存在一个文件中并在 GHCI 中加载该文件。然后,:reload当您进行一些更改并使用各种参数调用您的函数时,您就可以查看会发生什么。