Haskell函数非穷尽模式报错排查:两段求和求积代码问题咨询
解决Haskell交互模式下的非穷尽模式错误
你遇到的这个问题其实不是真的遗漏了模式——你的模式写法本身是完整的(空列表和非空列表的情况都覆盖了),问题出在GHCi的交互定义方式上!
当你在GHCi里逐行输入函数的不同模式时,每一行的定义都会直接覆盖掉之前的同名函数。比如你先输入sum' [] = 0,这时候sum'确实只有匹配空列表的逻辑;但当你接着输入sum' (x:xs) = x + sum' xs时,这个新定义会完全替换掉之前的sum',导致现在sum'只认识非空列表的模式,递归到空列表时自然就匹配失败,抛出非穷尽模式的错误了。
解决方法
这里有几种方式可以避免这个问题:
- 用多行包裹定义:在GHCi里用
:{和:}把函数的所有模式包裹起来,这样GHCi会把它们当作一个完整的函数定义,不会覆盖:
Prelude> :{ Prelude| sum' [] = 0 Prelude| sum' (x:xs) = x + sum' xs Prelude| :} Prelude> sum' [1,2,3,4,5] 15
- 写在文件里加载:把函数定义保存到一个
.hs文件(比如MyFunctions.hs),然后在GHCi里用:l MyFunctions加载,这样整个函数的所有模式都会被正确识别。 - 单行分号分隔:对于简单函数,可以把多个模式用分号写在一行,这样GHCi会把它们当作同一个函数的定义:
Prelude> sum' [] = 0; sum' (x:xs) = x + sum' xs Prelude> sum' [1,2,3,4,5] 15
预防这类问题的小技巧
- 开启警告:在GHCi里输入
:set -Wall,开启所有警告。这样当你定义非穷尽模式的函数时,GHCi会立刻提醒你,比如:
Prelude> :set -Wall Prelude> sum' (x:xs) = x + sum' xs <interactive>:1:1: warning: [-Wincomplete-patterns] Pattern match(es) are non-exhaustive In an equation for ‘sum'’: Patterns not matched: []
- 编译时检查:如果是用
ghc编译文件,加上-Wall参数,同样会给出详细的警告,帮你提前发现这类问题。
内容的提问来源于stack exchange,提问作者devio
相关产品推荐
相关产品推荐

