包含haskell中列表成员的第二个元素的列表

时间:2013-02-22 03:22:40

标签: list haskell

我正在努力解决前一年的旧期中期问题,而且我在这个问题上遇到了很多麻烦。

使用列表推导,实现具有以下类型的函数:

collectSecond :: [[Int]] -> [Int]

这样(collectSecond xs)返回一个包含xs列表成员的第二个元素的列表,但长度小于2的列表成员除外。例如:

collectSecond [[1,2,3], [4], [], [5,6]] ~> [2,6]
collectSecond [[1], [], [2]] ~> []
collectSecond [] ~> []

对此的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

您可以在列表推导中使用模式匹配来获得第二个元素:

collectSecond xs = [x2 |  x1:x2:rest <-  xs]

这里x2匹配xs包含的每个列表的第二个元素,如果有的话。

Prelude> collectSecond [[1,2,3], [4], [], [5,6]]
[2,6]

如果没有第二个元素,则没有元素添加到该子列表的列表中。例如,参见上例中的[4]和[]。

答案 1 :(得分:1)

使用基本递归实现起来也非常简单:

collectSecond ((x0:x1:_):ys) = x1:(collectSecond ys)
collectSecond (_:ys)         = collectSecond ys
collectSecond []             = []

(这里我们单独处理每个元素,并将其秒元素添加到我们创建的列表中,如果有的话,如果没有第二个元素则跳过它)

您也可以使用concatMap

collectSecond xs = concatMap seconds xs
    where seconds (x0:x1:_) = [x1]
          seconds _         = []