如何处理Haskell中列表中的重复元素

时间:2011-04-12 15:48:39

标签: list haskell duplicates

  

可能重复:
  Searching through list

我需要编写一个函数'once',给定一个Integers和一个Integer n的列表,返回一个布尔值,指示n是否恰好在列表中出现一次。 E.g。

Main>  once [2,3,2,4] 2
False
Main> once [1..100] 2
True

这是我目前的代码:

once :: Int -> [Int] -> Bool
once x [] = False
once x (y:ys) = (x==y) || (once x ys)

它只检查x是否是列表的一部分,但它不能告诉x在列表中出现多次,因此返回false。 需要帮助,谢谢!

2 个答案:

答案 0 :(得分:1)

这样做有很多可能性。如果您知道列表是有限的,您可以说:

once x xs = length (filter (==x) xs) == 1

(如果它不是有限的,则没有解决方案。)

顺便说一下,你几乎在你的解决方案中,你只需要替换

|| (once x ys)

&& (x `notElem` ys)

答案 1 :(得分:1)

试试这个:

  • 编写一个函数once,它扫描列表,直到它第一次找到元素或列表结尾。在后一种情况下,它返回False,否则它会在列表的其余部分调用once'并返回结果。
  • once'once基本相同,但如果找到元素则返回False,如果没有,则返回True