可能重复:
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。 需要帮助,谢谢!
答案 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
。