Haskell手动实现length函数报错‘non exhaustive patterns’问题排查
Haskell手动实现length函数的非穷尽模式错误解决
错误原因
你的代码模式匹配顺序写反了。Haskell的模式匹配是从上到下依次匹配的,第一个定义func list y中的list是变量,会匹配所有列表(包括空列表),导致第二个定义func [] y永远不会被执行。
当你调用func [1] 0时:
- 第一次匹配第一个函数,执行
func (tail [1]) 1,也就是func [] 1 - 此时仍然匹配第一个函数,尝试执行
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
相关产品推荐
相关产品推荐

