我有这个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)
答案 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.Tree
或Data.Set
。
对于简短的数字集,可以考虑Data.Bits
;它是O(1)查找和更新,但限制为32或64个值。