Haskell如何定义支持无限列表的longer函数判断列表长度是否大于指定值
你原来的代码卡死的核心原因是调用了length函数:该函数会遍历整个列表计算总长度,遇到无限列表时永远无法完成遍历,自然无法返回结果。
改写方案
不需要计算列表的完整长度,只要确认列表的元素个数比给定值多就可以立刻返回,无需遍历剩余元素,改后代码如下:
longer :: [a] -> Int -> Bool longer _ y | y < 0 = error "negative parameter" longer [] _ = False longer (_:xs) 0 = True longer (_:xs) y = longer xs (y - 1)
逻辑说明:
- 首先校验参数合法性,传入的整数小于0时直接抛出错误,和原有逻辑保持一致
- 如果列表为空,长度肯定不会大于任何非负整数,直接返回False
- 如果计数器已经减到0,说明当前列表至少还有1个未处理的元素,长度必然大于原给定值,直接返回True
- 其余情况递归处理列表剩余部分,计数器减1即可
效果验证
该实现对有限列表的处理逻辑和你原有的代码完全一致,处理无限列表时只会遍历到计数器归0就会直接返回,不会进入无限循环,比如调用longer [1..] 10会直接返回True。
内容的提问来源于stack exchange,提问作者Aaaa123
相关产品推荐
相关产品推荐

