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

Haskell手动实现length函数报错‘non exhaustive patterns’问题排查

Haskell手动实现length函数的非穷尽模式错误解决

错误原因

你的代码模式匹配顺序写反了。Haskell的模式匹配是从上到下依次匹配的,第一个定义func list y中的list是变量,会匹配所有列表(包括空列表),导致第二个定义func [] y永远不会被执行。

当你调用func [1] 0时:

  1. 第一次匹配第一个函数,执行func (tail [1]) 1,也就是func [] 1
  2. 此时仍然匹配第一个函数,尝试执行tail []——这会直接触发运行时异常,同时编译器因为检测到第二个模式永远无法被匹配,提前抛出“non exhaustive patterns”错误。

修正代码

把特定模式(空列表)放在前面,同时用模式匹配代替tail(避免空列表调用tail的崩溃问题):

func [] y = y
func (_:xs) y = func xs (y+1)
  • func [] y:匹配空列表,直接返回累加的计数y,作为递归终止条件
  • func (_:xs) y:匹配非空列表,_忽略第一个元素,xs取列表尾部,递归调用时计数+1

优化写法(可选)

如果不想手动传入初始值0,可以用辅助函数封装:

myLength :: [a] -> Int
myLength = go 0
  where
    go count [] = count
    go count (_:xs) = go (count + 1) xs

调用时直接用myLength [1,2,3]即可得到结果3。

内容的提问来源于stack exchange,提问作者malai_320

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 21:09:58