gpt4 book ai didi

列表理解唯一值

转载 作者:行者123 更新时间:2023-12-02 06:29:06 26 4
gpt4 key购买 nike

我想知道如何使用 Haskell 列表推导式从列表中获取唯一值。因此,如果我输入 [2,4,5,4,4,6,2],它将返回 [2,4,5,6]。

最初我从 unique (y:ys) = [x | x <- (y:ys)] 并且我知道我需要关于 x 的一些其他条件,但我不确定如何到达那里。

最佳答案

来自@amalloy 的评论认为列表推导仅限于“本地”视角,这是这里的关键见解。将 nub 写成列表理解是一种明智的方法,但您首先需要改变您的观点。

遗憾的是,库中省略了一个经常有用的函数,它是用上下文装饰列表的每个元素的函数。

picks :: [x] -> [([x], x, [x])]
picks [] = []
picks (x : xs) = ([], x, xs) : [(x : bs, y, as) | (bs, y, as) <- picks xs]

所以

picks [1,2,3] =
[([],1,[2,3]), ([1],2,[3]), ([1,2],3,[])]

列表中的每个元素都放在三元组的中间,元素“之前”在其左侧,元素“之后”在其右侧。

This answer of mine解释了使 picks 在某种意义上成为“标准”操作的深层结构,可从列表结构派生。但我们不需要这些背景信息来部署它。

picks 函数为我们提供了将 nub 编写为列表推导式所需的准确上下文信息。我们需要做的就是挑选出没有出现在它们自己的“前列表”中的元素。

myNub :: Eq x => [x] -> [x]
myNub xs = [x | (bs, x, as) <- picks xs, not (elem x bs)]

我不保证此操作的效率,但我确实喜欢将列表理解与额外的空间上下文相结合所带来的清晰度。

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

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