如何修改haskell函数以删除重复项
我有一个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
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
的实例。