haskell - 比较列表中的所有元素 haskell

标签 haskell recursion compare

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

[(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)]

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

最佳答案

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

-- 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

关于haskell - 比较列表中的所有元素 haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70014230/

相关文章:

haskell - Control.Lens 中的 "Illegal polymorphic or qualified type"

java - 确保对象实现 Comparable

c - 递归反向链表 - 不同的函数签名

c - 我想输出 1 3 4 5 7 9 但我几乎卡在这里

python - 如何使用Python找到两个具有相同名称的文件并检查它们是否相等?

C++ 字符串比较返回 0 但 bool 返回 false

haskell - Pipes.Binary.decode - StateT 有什么用?

haskell - 在 Haskell 中查找函数源(工作流程)

haskell - 将枚举类型存储在未装箱的向量中

recursion - 为什么这不是尾递归?