元组列表的交集 - Haskell

3

我有两个元组列表,格式均为 [(a,b),..]。

我希望比较它们并获得共同的元素——但是尝试使用intersect却不起作用。是否有一种使用map/filter来输出交集作为新元组列表的方法?


2
请展示你的代码,“intersect”应该可以很好地为你工作。 - Rizier123
2个回答

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
筛选器也可以这样写:filter (\elem` list2) list1` :) - Rizier123
在你的回答中,intersect 比较了元组的所有元素,但我认为题目发起者想要基于仅比较元组的第一个元素来找到所有交集。 - Arthur Welf

3
您可以使用 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)]

我猜这将返回左侧列表中匹配的元组。我们可以像这样表达:intersectBy ((==) \on` fst)select (min `on` snd)`吗? - kureta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接