gpt4 book ai didi

f# - List.fold和List.foldBack之间的区别的示例

转载 作者:行者123 更新时间:2023-12-03 23:08:56 25 4
gpt4 key购买 nike

我对List.foldList.foldBack之间的区别的理解是,foldBack以相反的顺序遍历其列表。这两个函数都会从列表中的项目中累积结果。

我在提出一个更好的示例时遇到了麻烦,在该示例中,最好将foldBack放在列表上。在我想出的示例中,如果函数逻辑执行相同的操作,则对于fold和foldBack而言,结果都是相同的。

[<Fact>]
let ``List.foldBack accumulating a value from the right to the left``() =
let list = [1..5]
let fFoldBack x acc =
acc - x

let fFold acc x =
acc - x

let foldBackResult = List.foldBack fFoldBack list 0
let foldResult = List.fold fFold 0 list

Assert.Equal( -15, foldBackResult ) // 0 - 5 - 4 - 3 - 2 - 1
Assert.Equal( -15, foldResult ) // 0 - 1 - 2 - 3 - 4 - 5

最佳答案

您在示例中看不到任何区别,因为您选择的函数对于任何x1x2

(acc - x1) - x2 = (acc - x2) - x1


因此,以何种顺序浏览列表并不重要,您将获得相同的结果。

列表构造是函数的一个示例,事实并非如此:

x1 :: (x2 :: acc) <> x2 :: (x1 :: acc)


因此,以下结果将产生不同的结果:

List.fold (fun acc x -> x :: acc) [] [1; 2; 3; 4; 5]
// val it : int list = [5; 4; 3; 2; 1]

List.foldBack (fun x acc -> x :: acc) [1; 2; 3; 4; 5] [];;
// val it : int list = [1; 2; 3; 4; 5]


List.fold从一个空的结果列表开始,一直到输入,将每个元素添加到结果列表的前面;因此最终结果是相反的。

另一方面, List.foldBack通过输入后退;因此,新添加到结果列表前面的每个元素本身都在原始列表的前面。因此,最终结果与原始列表相同。

关于f# - List.fold和List.foldBack之间的区别的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27935999/

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