比较列表haskell中的所有元素[重复]

Posted

技术标签:

【中文标题】比较列表haskell中的所有元素[重复]【英文标题】:compare all elements in a list haskell [duplicate] 【发布时间】:2021-12-29 00:16:21 【问题描述】:

我有一个包含元组元素的列表示例:

[(1,2),(3,9),(7,9),(6,4),(1,2),(4,2),(3,9),(1,2)]

我需要将第一个元素与其余元素进行比较,然后将第二个元素与列表的其余部分进行比较,依此类推以返回重复的元素

在这种情况下它应该返回

(1,2),(1,2),(1,2),(3,9),(3,9)

知道如何实现它吗?

我已经实现了

test :: Eq a => [(a,a)] -> [(a,a)]
test [(x,y)] = [(x,y)]
test (x:y:xs) 
    |((fst (x) == fst (y)) && (snd (x) == snd (y))) = ( [y]) ++ (test (x:xs) )
    |otherwise = test (x:xs)            

结束条件不好,总是返回列表的最后一个元素 test [(x,y)] = [(x,y)]

它只将第一项与列表的其余部分进行比较,但我需要将第二个、第三个...与列表的其余部分进行比较

【问题讨论】:

提示:import Data.List (partition); test (x:xs) = _ where (ys,zs) = partition _ _ 为什么这仅限于配对?你不能写test :: Eq a => [a] -> [a],然后用一对列表来称呼它吗?你让自己的生活变得更加艰难,同时让你的功能变得不那么有用。 【参考方案1】:

首先,如果您有两个元组,则比较元素与使用== 相同。所以

-- This code
(fst (x) == fst (y)) && (snd (x) == snd (y))
-- is the same as this code
x == y

其次,注意函数的递归性质。假设您有办法将当前列表拆分为

ys 等于第一个元素的列表 zs 不等于第一个的元素列表

那么ys 将是您最终解决方案的第一部分。您需要用 zs 做什么才能获得其余的解决方案?

下面有一个可以填写的小指南。 (这显然是一个任务,所以我不会给你完整的答案)

-- if you can't use imports, defined yourself this function.
import Data.List (partition)

test :: Eq a => [a] -> [a]
test [] = []
-- Hint: use recursion
test (x:xs) = undefined -- Notice that if ys is empty, then x wouldn't be a repeated element, so it should be discarted. 
 where (ys, zs) = partition (== x) xs
--      |   |- This is the list of element not equals to x
--      |- This is the list of elements equals to x

【讨论】:

我投了赞成票,因为这个答案提供了很好的学习建议并帮助 OP 了解他们的代码并改进它。但是应该注意,该算法具有二次时间复杂度。可以通过伪线性时间复杂度来解决这个问题,或者通过计算所有频率并将它们存储在 Map 中,或者通过对列表进行排序以使重复元素相邻。

以上是关于比较列表haskell中的所有元素[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Haskell趣学指南

比较两个列表的某些元素,Haskell

如何使用列表删除函数中的重复元素?

Haskell中两个列表元素的所有组合

Haskell 和 Erlang 中的模式匹配

Haskell 总结了通过树的所有路径