2016-11-09 479 views
0

我在haskell中編碼,並且想知道如何在多個列表中找到某個元素。如何打印每個列表中的某個元素

下面的例子讓說:

x = [(1,2,3,4,5), 
     (3,4,5,6,6), 
     (5,6,2,1,1), 
     (1,2,5,6,2)]; 

讓我們說,我想找到每個列表的第三個元素。

所以程序會打印出來4,6,1,6

我知道!!但是當我做一些像x一樣的東西! 3,它打印出第三行(1,2,5,6,2)。

我希望它打印出每個列表的第三個元素。

+1

您確定不打算列出清單嗎?現在,你有一個元組列表。除此之外,Haskell沒有通用的方式來從給定的元組和索引中提取元素。你可以做的最好的是map(\(_,_,_,e,_) - > e)x'。 – Alec

+0

so'x !! 3'會得到'x'的第三個索引,而不是'x'的每個元素的第三個索引?你如何將一個函數應用於列表的每個元素? – bheklilr

+0

@Alec theres沒有辦法像通過每個列表去獲得某個元素? –

回答

7

你提供的實際上並不是列表的列表,而是元組列表。元組根據元素的數量和類型有特殊的類型,所以上面的x的類型是[(Int,Int,Int,Int,Int)]

不像名單,這讓我們通過與!!運營商索引中提取值(例如:[1,2,3] !! 1 = 2),以便從一個元組,我們必須格局,整個元組匹配提取特定的值,給一些名字,我們希望值在我們的返回值中提取和使用它。爲了從持有5個值的元組的第四值,我們可以寫這樣的功能:

f (a,b,c,d,e) = d 

或者,作爲一個匿名函數(因爲,如果我們只打算使用它時,映射在列表,這是很好的懶得給它分配一個名稱):

(\(a,b,c,d,e) -> d) 

由於我們只關心第四值,我們可以選擇放棄所有其他人(你說的第三,但意味着指數3 - 上面>第4期) :

(\(_,_,_,x,_) -> x) 

現在我們有一個這樣的元組列表,我們希望將它應用於每個元組。我們可以map做到這一點,這將適用於功能到每個並從每個元組返回第三值的列表:

f xs = map (\(_,_,_,x,_) -> x) xs 

或者,用ETA還原:

f = map (\(_,_,_,x,_) -> x) 

用法示例:

gchi>> f [(1,2,3,4,5),(3,4,5,6,6),(5,6,2,1,1),(1,2,5,6,2)] 
[4,6,1,6] 
相關問題