gpt4 book ai didi

list - Haskell - 检查所有列表元素是否唯一

转载 作者:行者123 更新时间:2023-12-04 21:52:00 27 4
gpt4 key购买 nike

我需要比较给定列表的所有元素是否都是唯一的。
(为了记录,我这样做是出于学术目的。)

这是我迄今为止所拥有的:

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。

我错过了什么?
有人愿意发光吗?

最佳答案

另一种利用方式 notElem :

allDifferent :: (Eq a) => [a] -> Bool
allDifferent list = case list of
[] -> True
(x:xs) -> x `notElem` xs && allDifferent xs

次要变体,直接在方程中使用模式匹配:
allDifferent :: (Eq a) => [a] -> Bool
allDifferent [] = True
allDifferent (x:xs) = x `notElem` xs && allDifferent xs

我倾向于远离像 head,tail 这样的部分函数,所以基于 guard 的变体对我来说看起来更糟。

关于list - Haskell - 检查所有列表元素是否唯一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31036474/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com