为什么foldBack没有执行折叠相同的副作用?

时间:2016-02-05 07:51:50

标签: f# fold

我正在研究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

我期待“折叠N进入[列表]”以显示两种情况。但List.fold执行了累加器函数的副作用,List.foldBack没有。

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

1 个答案:

答案 0 :(得分:6)

你的参数的顺序错误。

应该是

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