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

时间:2012-06-11 09:47:29

标签: .net f#

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

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

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

3 个答案:

答案 0 :(得分:8)

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

对于可以与reducereduceBack一起使用的大部分操作,差异实际上并不重要。在更多数学术语中,如果您的操作是associative(例如数值运算,最大值,最小值或求和函数,列表连接等),则两者的行为相同。

您可以很好地看到差异的一个例子是构建一棵树,因为这完全显示了评估的工作原理:

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

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

          reduce        reduceBack
-------------------------------------
tree:       /\              /\
           /\ 3            0 /\
          /\ 2              1 /\
         0  1                2  3
-------------------------------------
flat:    0 1 2 3          0 1 2 3

答案 1 :(得分:4)

请查看MSDN文档reducereduceBack

对于reduce,它指定:

  

如果输入函数是f并且元素是i0 ... iN,那么它   计算f(...(f i0 i1)i2 ...)iN。

对于reduceBack,它指定:

  

如果输入函数是f并且元素是i0 ... iN,那么这个   函数计算f i0(...(f iN-1 iN))。

答案 2 :(得分:3)

他们的主要区别在于评估顺序。当reduce从第一个元素转到最后一个元素时,reduceBack的顺序相反。请注意,当前元素和累加器之间的顺序也在reduceBack中反转。

一个示范性的例子可能是:

let last xs = List.reduce (fun _ x -> x) xs   
let first xs = List.reduceBack (fun x _ -> x) xs