为什么 foldBack 不会执行与 fold 相同的副作用?
Why does foldBack not execute the same side-effects that fold does?
我正在研究 的答案,试图弄清楚 fold
和 foldBack
之间的区别。我现在了解应用程序顺序的差异,但我不了解副作用的差异。
我使用 List.fold
and List.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 [])))))
return true
都应该,而且他们确实做到了。太好了,我想;我明白它是如何工作的。但为了确保,我再次取消注释 f
和 f2
和 运行 List.fold f
和 List.foldBack f2
中的副作用行。未注释 printfn
行的 List.fold f [] [1; 2; 3; 4; 5]
结果:
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
未注释 printfn
行的 List.foldBack f2 [] [1; 2; 3; 4; 5]
结果:
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]
我正在研究 fold
和 foldBack
之间的区别。我现在了解应用程序顺序的差异,但我不了解副作用的差异。
我使用 List.fold
and List.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 [])))))
return true
都应该,而且他们确实做到了。太好了,我想;我明白它是如何工作的。但为了确保,我再次取消注释 f
和 f2
和 运行 List.fold f
和 List.foldBack f2
中的副作用行。未注释 printfn
行的 List.fold f [] [1; 2; 3; 4; 5]
结果:
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
未注释 printfn
行的 List.foldBack f2 [] [1; 2; 3; 4; 5]
结果:
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]