gpt4 book ai didi

haskell - 获取循环列表的第一个重复元素

转载 作者:行者123 更新时间:2023-12-02 10:05:47 24 4
gpt4 key购买 nike

我正在尝试从循环列表中获取第一个重复元素。例如

[1,-2, 3, 2, 3, 4, 5, 5]     => Just 3
[0,-2, 9, 2, 3, 4, -23,- 2] => Just (-2)

v1:

firstDup :: Ord a => [a] -> Maybe a
firstDup [] = Nothing
firstDup (x:xs)
| [x] `intersect` xs == [x] = Just x
| otherwise = firstDup xs

v2:

firstDup' :: Ord a => [a] -> Maybe a
firstDup' = go Set.empty
where
go _ [] = Nothing
go z (x:xs)
| x `Set.member` z = Just x
| otherwise = go (Set.insert x z) xs

我预计 v1 和 v2 会产生相同的结果,但事实并非如此。

firstDup       . cycle       $ [1,-2, 3, 2, 3, 4, 5, 5]  ==> Just 1
firstDup' . cycle $ [1,-2, 3, 2, 3, 4, 5, 5] ==> Just 3

我想知道为什么 v1 和 v2 工作会产生不同的结果。

最佳答案

注意谓词

[x] `intersect` xs == [x]

始终为true,因为cycle将列表无限次重复为

[1, -2, 3, 2, 3, 4, 5, 5, 1, -2, 3, 2, 3, 4, 5, 5, ...]

1 必须是 [-2, 3, 2, 3, 4, 5, 5, 1, -2, 3, 2, 3, 4, 5 的元素, 5, ...]

所以

[1] `intersect` [-2, 3, 2, 3, 4, 5, 5, 1, -2, 3, 2, 3, 4, 5, 5, ...] = [1]

这就是为什么 V1 firstDup 返回 Just 1

V2 中,firstDup' 递归地构造一个 Set,如下所示:

{}
{1}
{1, -2}
{1, -2, 3}
{1, -2, 3, 2, ...}

并检查下一个插入的元素是否是Set的元素:

1  `Set.member` {}
-2 `Set.member` {1}
3 `Set.member` {1, -2}
2 `Set.member` {1, -2, 3}
3 `Set.member` {1, -2, 3, 2}

请注意,3{1, -2, 3, 2} 的成员,因此 firstDup' 返回 Just 3..

关于haskell - 获取循环列表的第一个重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53734686/

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