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
相关产品推荐
相关产品推荐

