haskell - 学习 haskell : Making a function that returns a list of elements that only appear once

标签 haskell recursion list-comprehension

我正在学习 Haskell,我正在尝试制作一个递归函数,它接收一个整数列表并返回一个只在列表中出现一次的整数列表(once::[Int] -> [ Int] ),因此,例如,如果输入列表是 [4, 8, 1, 5, 1, 6, 2, 3, 4, 2] 则返回将是[8, 5, 6, 3] ,但我在编写代码时遇到了一些问题,如何将其变成递归函数。

我也在尝试使用列表理解来实现它,我目前正在 Learn You A Haskell 上阅读它,但是嗯也卡住了,所以如果你也有关于如何使用列表理解来实现它的想法我会很高兴看到这两种实现是如何工作的。

编辑:

once [] = []
once (x:xs)
             | (x `notElem` xs) = x : once xs
             | otherwise = once xs

但是因为我的代码做的恰恰相反,返回了重复的元素,当我尝试反转守卫的返回时它只返回没有重复元素的完整列表,我真的不满意关于如何让它返回我想要的东西的想法,只返回列表中出现过一次的独特元素。

最佳答案

基本上有三种可能的情况:

  1. 列表是空的,所以我们返回一个空列表;
  2. 列表不为空,第一项x是剩余列表xs中的一个元素,那么我们跳过该项,过滤掉尾部的所有项当我们递归时;和
  3. 列表不为空且第一项 x 未出现在列表的其余部分 xs 中,在这种情况下我们产生 x,并在 xs 上递归。

函数看起来像这样:

once :: [Int] -> [Int]
once [] = []
once (x:xs)
  | x `elem` xs = …
  | otherwise = …

我把它留作练习来填写 部分。对于第二种情况,您可以使用 filter :: (a -> Bool) -> [a] -> [a] .

关于haskell - 学习 haskell : Making a function that returns a list of elements that only appear once,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67340269/

相关文章:

haskell - Haskell 数组创建中允许哪些递归调用?

haskell - 使用类型族和泛型查找 Id 值

javascript - 无法弄清楚如何将零添加到增量函数

java - 谁能解释一下下面的递归是如何工作的?

Haskell - 检查列表是否至少包含 N 次元素

折叠/分组列表以聚合最大/最小值的 Pythonic 方式

python - 将元组作为字典中的值处理(在列表推导式中)

haskell - Haskell函数的"Default values"?

html - threepenny-gui - 打开文件

algorithm - 迭代 n * F(n - 1)+((n - 1) * F(n - 2))