F# 为什么foldBack没有像fold那样产生同样的副作用?

F# 为什么foldBack没有像fold那样产生同样的副作用?,f#,fold,F#,Fold,我正在研究答案,试图弄清折叠和折叠之间的区别。我现在明白了用药顺序的不同,但我不明白副作用的不同 我使用和进行测试。我的累加器函数基本上相当于:,因此累加器顺序很重要。我使用的累加器函数如下: 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

我正在研究答案,试图弄清
折叠
折叠
之间的区别。我现在明白了用药顺序的不同,但我不明白副作用的不同

我使用和进行测试。我的累加器函数基本上相当于
,因此累加器顺序很重要。我使用的累加器函数如下:

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)
以及:

两者都应该返回
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
val it : bool = true
未注释
printfn
行的
List.foldBack f2[][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
val it : bool = true
我希望在这两种情况下都会出现“将N折叠到[列表]”。但是
List.fold
执行了累加器功能的副作用,而
List.foldBack
没有


为什么两种形式的
折叠在副作用执行方面有差异?

您的参数顺序错误

应该是

> 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]

哦,我现在明白了。这就更有意义了——
foldBack
以累加器函数期望的相同顺序获取其参数(在
foldBack
中首先输入列表,在累加器函数中首先输入项)。错过这么简单的事情。谢谢这样做是为了避免错误:通常累加器和列表的类型不同,因此如果弄乱了参数的顺序,它将无法编译。