You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:55:20