2013-02-22 50 views
2

我正在尝试解决前一年的一个旧期中问题,并且我对此有很多麻烦。包含haskell中列表成员的第二个元素的列表

使用列表理解,实现与以下类型的函数:

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

使得(collectSecond XS)返回包含XS的列表成员的第二元素的列表,除了那些列表成员用长度少于两个。例如:

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

任何帮助,这将不胜感激。

回答

4

您可以使用模式匹配列表中的修真走出第二个元素,像这样:如果任何

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

这里X2匹配每个XS包含名单的第二个元素。

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

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

+1

非常感谢!列表内的列表令我感到困惑。 – Kitizhi 2013-02-22 05:43:44

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 _   = [] 
+0

非常感谢!从另一个角度看这件事很有帮助。 – Kitizhi 2013-02-23 08:02:23

相关问题