2011-04-12 23 views
1

可能重复:
Searching through list如何对付列表中的重复的元素在Haskell

我需要编写一个函数“一次”其中,由于整数和列表整数n返回一个布尔值,指示n是否仅在列表中出现一次。例如。

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。 需要帮助,谢谢!

+0

我打赌遵循相同的课程两名学生:d – 2011-04-13 09:28:49

+1

我希望教授范德姆特并不决定另设的评估,因为你的愚蠢和懒惰,而不是只能做自己,但到甚至改变问题的评估... – 2011-04-14 16:48:31

回答

1

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

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

(如果不是有限的,有没有办法解决。)

顺便问一下,您把它几乎在您的解决方案,你只要更换

|| (once x ys) 

&& (x `notElem` ys) 
+0

如果它是一个无限集,怎么办?谢谢... – sefirosu 2011-04-12 16:13:34

+3

它可能需要一段时间,如果它是无限的:) – 2011-04-12 16:18:14

+0

这是一个确切的重复,甚至下一个问题的http:// stackoverflow。 com/questions/5600706/searching-through-list ... – 2011-04-12 16:27:00

1

试试这个:

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