Haskell中sum与product函数出现Non-exhaustive patterns错误原因咨询
问题分析与解决
你的代码逻辑本身是正确的(覆盖了列表的空列表和非空列表两种模式),报错的原因通常是代码输入方式或格式问题,和GHC 2016年后的Prelude变更无关。
核心原因及解决方法
1. GHCi逐行输入导致模式被覆盖
在GHCi中,逐行输入同一个函数的多个模式时,每一行都会覆盖之前的定义,而非追加。例如:
- 先输入
product (x:xs) = x * product xs,此时product只有非空列表的模式; - 再输入
product [] = 1,此时product会被替换为只有空列表的模式;
无论调用哪种列表,都会触发「非穷举模式」错误。
解决方法:使用GHCi的多行输入块(:{ 和 :}),将同一个函数的所有模式放在一起输入:
:{ product (x:xs) = x * product xs product [] = 1 :} :{ sum [] = 0 sum (n:ns) = n + sum ns :}
2. 源文件中的缩进错误
如果是在源文件中编写,若第二个模式的函数名未与第一个模式对齐(比如第二个sum前有多余空格),编译器会将其解析为第一个函数内部的嵌套函数,导致顶层函数仅存在一个模式。
解决方法:确保同一个函数的所有模式行首严格对齐:
sum [] = 0 sum (n:ns) = n + sum ns -- 此行的sum需与上一行的sum完全对齐
关于GHC 2016年后的变更说明
Prelude中的sum和product确实在2015年左右(对应GHC 7.10)从列表专属函数改为Foldable类型类的方法,支持更多可折叠容器(如Maybe、Tree)。但这一变更不会影响你自定义的列表版本函数——只要你的定义覆盖了所有列表模式,编译器就不会报错,你遇到的问题与此无关。
内容的提问来源于stack exchange,提问作者Pavel Orekhov
相关产品推荐
相关产品推荐

