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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:24:07