2013-02-22 48 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

相關問題