如何在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]返回Trueascending [1,5,3,2]返回Falsedescending [5,4,3,1]返回Truedescending [5,1,4,3]返回False
空列表、单元素列表默认返回True,符合通用的有序性定义,如果你有特殊业务要求,直接修改对应边界分支的返回值即可。
内容的提问来源于stack exchange,提问作者user17243146
相关产品推荐
相关产品推荐

