reduce和reduceBack之间有什么区别吗?

Omu*_*Omu 5 .net f#

我正在从msdn学习f#并查看并尝试减少和减少,我找不到任何差异,签名是相同的

('T -> 'T -> 'T) -> 'T list -> 'T

并且他们都在空列表中抛出相同的错误,所以为什么有2个,应该有一些区别

Tom*_*cek 8

其他人已经解释了差异 - 他们以不同的顺序减少元素.

对于大部分的操作,您可以使用使用reducereduceBack,差异实际上并不重要.在更多的数学术语中,如果您的操作是关联的(例如数字运算,max,min或sum函数,列表连接等),那么两者的行为相同.

您可以很好地看到差异的一个示例是构建一个树,因为它准确地显示了评估的工作方式:

type Tree = 
  | Leaf of int
  | Node of Tree * Tree

[ for n in 0 .. 3 -> Leaf n]
|> List.reduce (fun a b -> Node(a, b))

[ for n in 0 .. 3 -> Leaf n]
|> List.reduceBack (fun a b -> Node(a, b))
Run Code Online (Sandbox Code Playgroud)

以下是您获得的两棵树(但请注意,如果您将它们展平,那么您将获得相同的列表!)

          reduce        reduceBack
-------------------------------------
tree:       /\              /\
           /\ 3            0 /\
          /\ 2              1 /\
         0  1                2  3
-------------------------------------
flat:    0 1 2 3          0 1 2 3
Run Code Online (Sandbox Code Playgroud)