2009-10-24 77 views
7

Haskell的新手和有一個絆腳石。我試圖根據第一項篩選元組列表。過濾元組列表

filter (==(x,_)) lis 

我得到一個非法'_'錯誤,但我不知道我怎麼能解決它?

回答

19

在Haskell中,不能像遍歷列表一樣遍歷一個元組。

如果該元組只有兩個項目,則可以使用fst檢索元組的第一個項目並使用snd檢索第二個項目。做什麼,我覺得你想要做

一種方法是這樣的方法:

Prelude> let lst = [(1,2), (3,4)] 
Prelude> filter ((==1).fst) lst 
[(1,2)] 

其中僅將列表中的第一個元素等於1項;當然,您也可以替換x這裏我把1

要成爲一個更具體一點,(==1).fst首先應用fst在善堂的元素,然後應用到(==1)fst結果 - 技術上,點組成這兩個功能在一起。

+0

這很好,謝謝。想知道那些。在所有示例代碼中做了些什麼! – Zippy 2009-10-24 16:59:12

+0

我認爲'''和'$'之間的用法(和區別)是開始Haskell最常見的障礙之一 - 所以不用擔心,你不是唯一遇到麻煩的人! – 2009-10-24 17:05:15

5

您不能在其中通配符_==運算符(或任何其他函數)發生爭執。爭論必須是一種真正的價值,而不是一種應該與之相匹配的模式。

如果你想使用模式匹配,你可以使用lambda函數,你filter條件:

filter (\(a,_) -> a == x) lis 

此外,還有預定義功能fst提取兩個元素的元組的第一個元素。這可以結合==做相同的測試:

filter ((== x) . fst)) lis