Haskell递归实现hasSameLength函数判断两列表长度是否相等
问题1:非穷尽模式报错的原因
你原有代码的模式匹配覆盖范围不全:仅覆盖了空列表对空列表、空列表对长度为1的非空列表、长度为1的非空列表对空列表、两个长度≥1的列表的场景。当其中一个是空列表,另一个是长度≥2的列表/无限列表时,没有对应的匹配分支,所以会抛出非穷尽模式错误。你不需要限定非空列表的长度,用_:_匹配任意非空列表即可。
问题2:修改后GHCi卡住的原因
你新增的&& hasSameLength (x) (y)逻辑完全错误:x和y是列表的头元素,不是列表类型,传入要求列表参数的hasSameLength本身就违反类型约束。如果你的元素刚好也是列表类型,就会陷入无意义的无限递归,永远不会返回结果,所以GHCi会卡住,这部分代码完全不需要添加。
正确实现
hasSameLength :: [a] -> [b] -> Bool -- 两个列表都为空,长度相等 hasSameLength [] [] = True -- 第一个为空,第二个非空,长度不等 hasSameLength [] (_:_) = False -- 第一个非空,第二个为空,长度不等 hasSameLength (_:_) [] = False -- 两个都非空,递归判断剩余部分长度 hasSameLength (_:xs) (_:ys) = hasSameLength xs ys
示例验证
上述实现完全符合要求:
hasSameLength "apple" "peach"两个都是5个元素,递归5次后双双为空,返回TruehasSameLength "apple" "cherry"前者5个元素后者6个,递归5次后前者为空、后者还有1个元素,返回FalsehasSameLength [] [1..]直接匹配第二个分支,立刻返回False,不会遍历无限列表hasSameLength [1..] []直接匹配第三个分支,立刻返回False,不会遍历无限列表
内容的提问来源于stack exchange,提问作者BeanieBarrow
相关产品推荐
相关产品推荐

