gpt4 book ai didi

list - Haskell:列表理解

转载 作者:行者123 更新时间:2023-12-04 05:29:52 28 4
gpt4 key购买 nike

我有一个接收列表的函数,如果列表中有 2 个相同且连续的数字,并且如果列表中的其他地方有一个数字 x,这是等效的,那么我想将 x 更改为 0 并且返回列表。

twoAdjThenThirdZero (x:y:xs) = [if x == y && x `elem` xs then 0 else x | x <- xs]

出于某种原因,每次我尝试运行它时,它都会省略列表中的前两个元素。
*Main> twoAdjThenThirdZero [2,3,4,1,2,0,2,3,3]

[4,1,2,0,2,0,0]

此外,上述案例与我想要的相反。我想将两个 3 保留在列表的末尾,并使第二个元素 3 为 0。但它被切换了。
*Main> twoAdjThenThirdZero [2,2,3,1,2,4]

[3,1,0,4]

有谁知道这是为什么?提前致谢!

最佳答案

我在这里看到多个问题。您首先解构函数声明中的参数列表 twoAdjThenThirdZero (x:y:xs) .如果要继续得到每一步的 x 和 y,则必须递归。相反,您切换到使用列表推导式和 x 的副本。在列表推导式中,您通过 xs,它是函数参数的所有元素,除了前两个(x 和 y)。

如果您大声阅读列表理解,我想您可以弄清楚。

“如果 x 等于 y 并且 x 是 xs 的一个元素,那么对于 xs 中的每个 x,则为零否则 x”。但是您希望为 x+y+xs 中的每个 x 完成!您还以两种方式使用名称“x”,包括函数参数的解构和列表推导式中的变量。

编辑:

现在我明白你的意思了。您只需要将显式递归添加到您已有的内容中。

twoAdjThenThirdZero [] = []
twoAdjThenThirdZero [x] = [x]
twoAdjThenThirdZero (x:y:xs)
| x == y && x `elem` xs = x : y : twoAdjThenThirdZero [if z == x then 0 else z | z <- xs]
| otherwise = x : twoAdjThenThirdZero (y:xs)

我希望这对您有意义,如果没有,我会尝试进一步解释!

编辑:

phynfo 已经发布了我正在写的内容的稍微简单的版本!

关于list - Haskell:列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12772068/

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