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

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次后双双为空,返回True
  • hasSameLength "apple" "cherry" 前者5个元素后者6个,递归5次后前者为空、后者还有1个元素,返回False
  • hasSameLength [] [1..] 直接匹配第二个分支,立刻返回False,不会遍历无限列表
  • hasSameLength [1..] [] 直接匹配第三个分支,立刻返回False,不会遍历无限列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:27:03