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

时间:2018-02-07 00:43:28

标签: 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)

1 个答案:

答案 0 :(得分:4)

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

类似的东西:

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.TreeData.Set

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