【发布时间】:2015-06-24 20:32:51
【问题描述】:
我需要比较给定列表的所有元素是否都是唯一的。 (为了记录,我这样做是出于学术目的。)
这是我目前所拥有的:
allDifferent :: (Eq a) => [a] -> Bool
allDifferent list = case list of
[] -> True
(x:xs) -> if x `elem` xs then False else allDifferent xs
效果很好!
现在,当我尝试这样做时......
allDifferent2 :: (Eq a) => [a] -> Bool
allDifferent2 list
| null list = True
| (head list) `elem` (tail list) || allDifferent2 (tail list) = False
| otherwise
它只是没有按预期工作。 我从 GHCi 得到以下输出:
*Main> allDifferent2 [1..4]
False
*Main> allDifferent2 [1..5]
True
*Main> allDifferent2 [1..6]
False
*Main> allDifferent2 [1..7]
True
即对于具有偶数个元素的每个列表,它输出 False,对于奇数个元素,它输出 True。
我错过了什么? 有人愿意发光吗?
【问题讨论】:
-
不应该是
null list = True来匹配你原来的实现吗? -
是的,抱歉.. 错字.. 刚刚修复了这个问题,但是错误仍然存在。
-
所以你有
head list `elem` tail list || allDifferent2 (tail list) = False,它基本上是在说“如果第一个元素在列表中的某个地方,或者如果列表的所有其余部分都充满了唯一性,那么返回 False”。你确定这是你想要的行为吗?您可以使用head list `elem` tail list = allDifferent2 (tail list)使其更简单,我认为这对您更有效。 -
如果您对
allDifferent2的递归调用返回 True,则警卫通过,然后您返回 False,这可能不是您想要的。
标签: list haskell functional-programming comparison