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
中首先输入列表,在累加器函数中首先输入项)。错过这么简单的事情。谢谢这样做是为了避免错误:通常累加器和列表的类型不同,因此如果弄乱了参数的顺序,它将无法编译。