我正在努力解决前一年的旧期中期问题,而且我在这个问题上遇到了很多麻烦。
使用列表推导,实现具有以下类型的函数:
collectSecond :: [[Int]] -> [Int]
这样(collectSecond xs)返回一个包含xs列表成员的第二个元素的列表,但长度小于2的列表成员除外。例如:
collectSecond [[1,2,3], [4], [], [5,6]] ~> [2,6]
collectSecond [[1], [], [2]] ~> []
collectSecond [] ~> []
对此的任何帮助将不胜感激。
答案 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 _ = []