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

如何在Haskell中用列表推导式判断列表是否升序或降序有序

Haskell 基于列表推导式的列表有序性判断实现

问题修正思路

你原有代码的问题是固定取列表第二个元素作为比较基准,所有元素都和同一个值对比,无法校验相邻元素的大小关系。
要实现全列表有序判断,核心逻辑是校验所有相邻元素都满足对应的大小关系,最终用and函数对所有校验结果做逻辑与,就能得到标识整体是否有序的布尔值。

完整实现代码

升序判断(允许相等值,严格升序将<=改为<即可)

ascending :: Ord a => [a] -> Bool
ascending [] = True
ascending [_] = True
ascending l = and [x <= y | (x, y) <- zip l (tail l)]

降序判断(允许相等值,严格降序将>=改为>即可)

descending :: Ord a => [a] -> Bool
descending [] = True
descending [_] = True
descending l = and [x >= y | (x, y) <- zip l (tail l)]

实现逻辑说明

  • zip l (tail l)会将原列表和去掉首元素的列表按位置配对,刚好生成所有相邻元素组成的二元组,例如输入[1,2,3,4]会得到[(1,2),(2,3),(3,4)]
  • 列表推导式遍历每一对相邻元素,校验大小关系得到布尔值列表
  • and函数会对布尔值列表做逻辑与运算,只有所有校验项都为True时,最终返回结果才为True,即整个列表有序

测试示例

  • ascending [1,2,3,5] 返回 True
  • ascending [1,5,3,2] 返回 False
  • descending [5,4,3,1] 返回 True
  • descending [5,1,4,3] 返回 False

空列表、单元素列表默认返回True,符合通用的有序性定义,如果你有特殊业务要求,直接修改对应边界分支的返回值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:27:03