Haskell:如何过滤列表列表?

时间:2016-03-25 21:01:52

标签: haskell

给出列表清单:

xss = [[1,2,3],[4,5,6],[7,8]]

我希望按列表大小然后按余数过滤它,然后返回Int。

列表

以下是我的两次尝试:

concat [[x | x <- xs, mod x 2 == 0] | xs <- xss, length xs > 2]

filter (\x -> mod x 2 == 0) $ concat $ filter (\x -> length x > 2) xss

是否有更具表现力的方式来做同样的事情,但代码更少?

2 个答案:

答案 0 :(得分:5)

Haskell中有一个内置的even函数,您还可以使用Blunt获得帮助转换为无点样式的帮助。这给你:

filter even . concat . filter ((> 2) . length)

答案 1 :(得分:3)

单个列表理解就足够了

[x | xs@(_:_:_:_) <- xss, x <- xs, mod x 2 == 0]

模式(_:_:_:_)匹配所有至少包含三个元素的列表。