如何用列表推导式实现filterTriples函数筛选升序三元组?
用列表推导式实现筛选升序整数三元组的filterTriples函数
你需要实现一个filterTriples函数,接收整数三元组列表,移除其中不符合非严格升序(即a <= b <= c)的三元组,示例如下:
filterTriples [(1,2,3), (6,5,4), (6,6,6)] -- 结果为 [(1,2,3), (6,6,6)]
你已经实现了生成符合条件三元组的函数,但现在需要对已存在的三元组列表进行筛选,而非从头生成。
实现方法
用列表推导式直接对输入列表进行过滤即可,核心是为每个三元组添加a <= b && b <= c的判断条件:
filterTriples :: [(Int, Int, Int)] -> [(Int, Int, Int)] filterTriples triples = [(a, b, c) | (a, b, c) <- triples, a <= b && b <= c]
逻辑说明
- 列表推导式中,
(a, b, c) <- triples遍历输入列表中的每个三元组,将其解构为三个整数a、b、c - 后面的
a <= b && b <= c是过滤条件,只有满足非严格升序的三元组才会被保留到结果列表中
和你现有生成函数的区别
你之前的filterTriplets函数是从[1..n]的范围内生成同时满足升序条件的三元组,而现在的filterTriples是对已有的三元组列表进行筛选,两者逻辑相似但处理对象不同:
- 生成函数:
[(a,b,c) | a <- [1..n], b <- [1..n], c <- [1..n], a<=b && b<=c] - 筛选函数:
[(a,b,c) | (a,b,c) <- triples, a<=b && b<=c]
内容的提问来源于stack exchange,提问作者lewis
相关产品推荐
相关产品推荐

