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

Haskell技术问询:如何判断列表的列表中是否存在空列表?

解决Haskell判断列表的列表是否包含空列表的问题

先说说你写的两个实现的问题:

  • 第一个实现只检查了第一个子列表x,完全没处理剩下的xs,所以只有第一个子列表为空时才返回True,后面的子列表根本没被检查到。
  • 第二个实现里的null xs是判断外层列表是否已经遍历完(也就是剩下的列表为空),不是检查子列表,逻辑完全错误,结果自然不对。

正确的递归实现

你需要递归遍历外层列表的每个子列表,只要找到一个空列表就返回True,遍历完所有子列表都没找到就返回False,同时要处理外层列表为空的边界情况:

hasEmpty :: [[a]] -> Bool
hasEmpty [] = False  -- 外层列表为空,不存在空列表
hasEmpty (x:xs) = null x || hasEmpty xs  -- 当前子列表为空,或者递归检查剩余列表

这个逻辑很清晰:如果第一个子列表是空的,直接返回True;否则继续检查剩下的子列表,只要其中有一个空列表,整体结果就是True。

更简洁的实现:利用any函数

你提到尝试过any但没成功,其实any刚好适配这个场景——它会遍历列表,只要有一个元素满足给定的谓词就返回True。这里我们的谓词就是null(判断子列表是否为空),所以一行就能搞定:

hasEmpty :: [[a]] -> Bool
hasEmpty = any null

any null会逐个检查每个子列表,一旦找到空列表就立刻返回True,效率和递归版本一致,写法更简洁。

另外你尝试的elem也能实现需求,只要判断空列表[]是否是外层列表的元素即可:

hasEmpty :: [[a]] -> Bool
hasEmpty = elem []

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:35:36