Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修改haskell函数以删除重复项_Haskell_Functional Programming - Fatal编程技术网

如何修改haskell函数以删除重复项

如何修改haskell函数以删除重复项,haskell,functional-programming,Haskell,Functional Programming,我有一个haskell函数,它将两个深度的列表展平为一个列表。我如何编辑它以确保它不允许重复?例如 flatten[['a'],[],['a','b']] --> ['a','b'] 我当前的程序将输出 ['a','a','b'] flatten :: [[a]] -> [a] flatten [] = [] flatten ([]:vs) = flatten vs flatten ((x:xs):vs) = x:flatten (xs:vs

我有一个haskell函数,它将两个深度的列表展平为一个列表。我如何编辑它以确保它不允许重复?例如

flatten[['a'],[],['a','b']] --> ['a','b']
我当前的程序将输出

['a','a','b']

flatten :: [[a]] -> [a]
flatten []            = []
flatten ([]:vs)       = flatten vs
flatten ((x:xs):vs)   = x:flatten (xs:vs)

跳过未排序列表中的重复项需要保留一组已看到的元素,并检查每个传入元素

比如:

dedupliction_step :: [a] -> SetOf a -> [a] -> [a]

deduplication_step [] _ output = output
dedupliction_step (x:rest) already_seen output = 
  if x `belongsTo` already_seen then deduplication_step rest already_seen output
  else deduplication_step rest updated_seen x:output where
    updated_seen = putElementInto already_seen x
这给了你一个想法。如何实现
SetOf
及其相关操作取决于手头的问题

对于短集合,您可以使用
SetOf
=
List
;然后
belongsTo
=
elem
。但是,它有一个线性查找时间,因此对于长集合,它会变得昂贵

对于长集合,您可以使用例如带有对数查找和更新时间的
Data.Tree
Data.Set


对于较短的数字集,
数据。可以考虑位
;它是O(1)查找和更新,但限制为32或64个值。

跳过未排序列表中的重复项需要保留一组已看到的元素,并检查每个传入元素

比如:

dedupliction_step :: [a] -> SetOf a -> [a] -> [a]

deduplication_step [] _ output = output
dedupliction_step (x:rest) already_seen output = 
  if x `belongsTo` already_seen then deduplication_step rest already_seen output
  else deduplication_step rest updated_seen x:output where
    updated_seen = putElementInto already_seen x
这给了你一个想法。如何实现
SetOf
及其相关操作取决于手头的问题

对于短集合,您可以使用
SetOf
=
List
;然后
belongsTo
=
elem
。但是,它有一个线性查找时间,因此对于长集合,它会变得昂贵

对于长集合,您可以使用例如带有对数查找和更新时间的
Data.Tree
Data.Set


对于较短的数字集,
数据。可以考虑位
;它是O(1)查找和更新,但限制为32或64个值。

我只是想将列表[[a]]的列表展平为单个列表[a],没有重复数据。您尝试过任何方法来实现重复数据消除吗?如果是,出了什么问题?
nub
是您需要的很难用谷歌搜索的名称。
nub
是O(n^2),可能不是您需要的名称,具体取决于您需要什么。@ThomasM.DuBuisson,我已经尝试过一些检查,例如如果xs==x,请尝试再次调用该函数。但我不明白如何从本质上跳过重复项。我只是想将列表[[a]]平铺为一个列表[a]而不重复。您尝试过任何方法来实现重复消除吗?如果是,出了什么问题?
nub
是您需要的很难用谷歌搜索的名称。
nub
是O(n^2),可能不是您需要的名称,具体取决于您需要什么。@ThomasM.DuBuisson,我已经尝试过一些检查,例如如果xs==x,请尝试再次调用该函数。但我不明白如何从本质上跳过重复项。是否有任何方法可以提前查看列表中的下一项,并将其与当前项进行比较?如果它们相似,你可以跳过它。。我不知道这在中国是否有可能Haskell@PushedCrayon是:尝试模式保护
f(x1:x2:xs)| x1==x2=f(x2:xs)
。要定义
=
,列表元素的类型必须是
Eq
的实例。是否有任何方法可以查看列表中的下一项并将其与当前项进行比较?如果它们相似,你可以跳过它。。我不知道这在中国是否有可能Haskell@PushedCrayon是:尝试模式保护
f(x1:x2:xs)| x1==x2=f(x2:xs)
。要定义
=
,列表元素的类型必须是
Eq
的实例。