gpt4 book ai didi

f# - 为什么 foldBack 不会执行与 fold 相同的副作用?

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

我正在研究 Example of the difference between List.fold and List.foldBack 的答案试图了解 foldfoldBack 之间的区别。我现在了解应用程序顺序的差异,但我不了解副作用的差异。

我用了List.foldList.foldBack为了我的测试。我的累加器函数基本上等同于 ::,因此累加顺序很重要。我使用的累加器函数如下:

let f acc x =
// printfn "Folding %A into %A" x acc // Side-effect!
x :: acc

let f2 x acc =
// printfn "Folding %A into %A" x acc // Side-effect!
x :: acc

我从 F# 引用资料中了解到:

List.fold f [] [1; 2; 3; 4; 5] = (f (f (f (f (f [] 1) 2) 3) 4) 5)

和:

List.foldBack f2 [] [1; 2; 3; 4; 5] = (f2 1 (f2 2 (f2 3 (f2 4 (f2 5 [])))))

应该都返回 true,而且他们确实这样做了。太好了,我想;我明白它是如何工作的。但为了确定,我取消了 ff2 中的副作用行的注释,并运行了 List.fold fList。 foldBack f2 再次。 List.fold f [] [1; 的结果2; 3; 4; 5] printfn 行未注释:

Folding 1 into []
Folding 2 into [1]
Folding 3 into [2; 1]
Folding 4 into [3; 2; 1]
Folding 5 into [4; 3; 2; 1]
val it : bool = true

List.foldBack f2 [] [1; 的结果2; 3; 4; 5] printfn 行未注释:

val it : bool = true

我原以为“Folding N into [list]”会在这两种情况下出现。但是 List.fold 执行了它的累加器函数的副作用,而 List.foldBack 没有。

为什么两种形式的fold在副作用执行上存在差异?

最佳答案

你的参数顺序错误。

应该是

> List.foldBack f2  [1; 2; 3; 4; 5] [];;
Folding 5 into []
Folding 4 into [5]
Folding 3 into [4; 5]
Folding 2 into [3; 4; 5]
Folding 1 into [2; 3; 4; 5]
val it : int list = [1; 2; 3; 4; 5]

关于f# - 为什么 foldBack 不会执行与 fold 相同的副作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35218872/

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