首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表列表的交集Haskell

列表列表的交集Haskell
EN

Stack Overflow用户
提问于 2017-05-11 22:32:56
回答 3查看 3K关注 0票数 0

我必须写一个函数,返回2个以上列表的交互

代码语言:javascript
复制
Ex: intersection[[1,5,3,11],[1,5,2,11],[5,3,2,11]] = [5, 11]
intersection:: (Eq a) => [[a]] -> [a]
intersection= undefined

我发现存在一个函数intersect ::Eq a => a -> a -> a

EN

回答 3

Stack Overflow用户

发布于 2017-05-11 22:43:13

当您注意到一个形式为a -> a -> a的函数时,您可能正在处理一个可以与monoid一起使用的函数,这意味着您可以使用folds。

在您的例子中,intersection []实际上没有一个合理的输出,所以应该使用一个需要非空输入列表的折叠函数,比如foldr1

因此,一种简单的实现方式是:

代码语言:javascript
复制
intersection:: (Eq a) => [[a]] -> [a]
intersection = foldr1 intersect
票数 4
EN

Stack Overflow用户

发布于 2017-05-11 22:48:47

两个集合的交集是关联的(也是可交换的,但在这里不是那么重要)。即:

代码语言:javascript
复制
intersect(A, B, C) = intersect(intersect(A,B), C) = intersect(A, intersect(B, C))

这意味着无论你以什么顺序进行交集操作,结果都不会改变。

因此,在Haskell中,您可以利用foldl1函数对所有列表应用intersect函数:

代码语言:javascript
复制
> import Data.List
> foldl1 intersect [[1,5,3,11],[1,5,2,11],[5,3,2,11]]
[5,11]
票数 3
EN

Stack Overflow用户

发布于 2017-05-11 22:41:18

简易方法专业技巧:

专业技巧:

两个列表的交集是显而易见的。

3个列表的交集是第三个列表与前2个列表的交集。

所以你要做的就是记住你当前的交集结果,并将它与下一个列表相交,直到你用完所有的列表,或者直到你的交集为空。

在复杂性方面,更好的方法是使用类似合并排序的方法。

当你的威胁列表就像列表的元素,而不是理解的时候,在元素上使用intersect并返回它们的交集。

合并操作也将是一个交集。

我已经很久没有和Haskell打交道了,所以不幸的是,我不能给你提供代码样本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43918438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档