2015-12-17 55 views
1

我有兩種形式爲[(a,b),..]的元組列表。元組列表的交集-Haskell

我想比較它們並獲得常用元素 - 但嘗試使用相交,但這不起作用。有沒有一種使用map/filter將交集作爲新的元組列表輸出的方法?

+2

請出示你的代碼,'intersect'應該可以正常爲你 – Rizier123

回答

4

嘗試用一個列表理解:

[x | x <- list1, x `elem` list2] 

例子:

Prelude> let list1 = [(1,2), (2,3), (3,4)] 
Prelude> let list2 = [(1,2), (2,3), (3,5)] 
Prelude> [x | x <- list1, x `elem` list2] 
[(1,2),(2,3)] 

反正intersect應該工作,它爲我工作:

Prelude> import Data.List 
Prelude Data.List> list1 `intersect` list2 
[(1,2),(2,3)] 
+1

過濾器也將工作:'過濾器(\'ELEM \'列表2)list1' :) – Rizier123

+0

在你的答案'intersect'的所有元素進行比較元組,但我認爲主題首發想根據比較元組的第一個元素來找到所有的交集。 –

2

可以使用Data.Function.on功能您需要給元組的第一個(或第二個)元素提供函數:

import Data.Function (on) 
import Data.List (intersectBy) 

intersectBy ((==) `on` fst) [(1,2), (2,3), (3,4)] [(1,2), (2,3), (3,5)] 
> [(1,2),(2,3),(3,4)] 
+0

我想這會從左邊的列表中返回匹配的元組。我們可以告訴像''fst)''和'select(min \'on \'snd)''intersectBy((==)\'')嗎? – kureta