基本的haskell:将[[int]]转换为[int]

时间:2013-10-07 12:17:57

标签: haskell

有没有简单的方法可以将[[int]]更改为[int]或者在此表单中比较它们,以确定是否缺少元素。

例如

  set1=   [[1,2,3]] 
  set2= [2,3,]

返回[1]。我试过这个:

return s1 s2= [x|x<-s1,y<-s2, x/=y]

跟进问题: 如何防止返回重复项 例如,如果

set1 = [[1,1,1,2,3]

如何才能让return函数只给[1]

3 个答案:

答案 0 :(得分:3)

如果你有[[1,2,3]],你可以使用concat

Prelude> x
[[1,2,3]]
Prelude> concat x
[1,2,3]
Prelude> 

对于第二部分,我邀请您阅读此Algorithm - How to delete duplicate elements in a Haskell list

那里有一个直接的实施。

答案 1 :(得分:1)

这里似乎有三个截然不同的问题。

第一个问题,如何将列表的列表转换为列表?

concat [[1,1,2],[2,1,3]] == [1,1,2,2,1,3]

第二个问题,如何从列表中删除重复项?您可以使用nub(请记住import Data.List):

nub [1,2,1,3] == [1,2,3]

也许您只想删除连续重复项?例如,如果您知道您已经对列表进行了排序:

map head (group [1,1,1,2,3]) == [1,2,3]

在那里,group会将它们分组为连续重复的列表,然后head仅用于返回每组重复项中的第一个。

第三个​​问题,如何在list1中找到的list1中的项目:

list1 \\ list2

但请注意,如果列表不在列表中并且任一列表包含dupes,\\可能无法按预期运行。如果你想了解它在这些情况下的行为,请仔细阅读。

答案 2 :(得分:0)

使用concat[[a]]转换为[a]nub(从Data.List转换)以从列表中删除重复的元素。

ghci中的演示:

>  import Data.List (nub)  
>  let set1 = [[1,2,3]]  
>  let set2 = [2,3]  
>  concat set1 == set2  
False  
>  let set1 = [[1,1,1,2,3]]  
>  nub (concat set1)  
[1,2,3]