gpt4 book ai didi

haskell - 如何从功能上计算未知大小列表的连续元素之间的差异?

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

在纯函数式编程语言中(如 Haskell)或仅以函数方式使用它的语言(如 clojure);假设您有一个整数列表/seq/enumerable(大小未知),并且您想要生成一个新的列表/seq/enumerable,其中包含连续项之间的差异,您会怎么做?

我之前在 C# 中所做的就是折叠列表并保留一个状态对象作为记录“前一个”项目的聚合值,以便您可以将其与当前项目进行比较。结果列表还必须进入状态对象(这对于未知大小的列表来说是一个问题)

功能性地执行此类操作的一般方法是什么?

最佳答案

在 Haskell 中,您可能只使用一些高阶函数,例如 zipWith。所以你可以这样做:

diff [] = []
diff ls = zipWith (-) (tail ls) ls

请注意我如何单独处理 [] 情况 - 如果将空列表传递给 tail,则会出现运行时错误,而 Haskellers确实真的讨厌运行时错误。但是,在我的函数中,我保证 ls 不为空,因此使用 tail 是安全的。 (作为引用,tail 仅返回列表中除第一项之外的所有内容。它与Scheme 中的cdr 相同。)

这仅获取列表及其尾部,并使用 (-) 函数组合所有项目。

给定一个列表[1,2,3,4],这将是这样的:

zipWith (-) [2,3,4] [1,2,3,4]
[2-1, 3-2, 4-3]
[1,1,1]

这是一种常见的模式:通过巧妙地使用标准高阶函数,您可以计算出令人惊讶的许多东西。您也不用担心将列表及其尾部传递给函数——不会有任何突变让您陷入困境,而且编译器通常非常聪明地优化这样的代码。

巧合的是,如果您喜欢列表推导式并且不介意启用 ParallelListComp 扩展,您可以这样编写 zipWith (-) (tail ls) ls:

[b - a | a <- ls | b <- tail ls]

关于haskell - 如何从功能上计算未知大小列表的连续元素之间的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9512513/

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