如何理解reduceLeft的功能?

时间:2013-09-17 21:19:28

标签: scala

为什么可以插入(1 :: xs)? 一个是列表xs的开头。

所以List(3,2,1)成为List(1,3,2,1),但(1 :: xs)的重要性是什么?

我无法理解其工作原理:

def product(xs : List[Int]) = (1 :: xs) reduceLeft((x , y) => x * y)

在方法签名中,没有描述前缀操作数(在本例中为(1 :: xs))? :

def reduceLeft[B >: A](f: (B, A) => B): B =

3 个答案:

答案 0 :(得分:2)

(1 :: xs)不是前缀操作数。

您实际上是在列表xs之前添加1。

因此product(List(3,2,1))变为List(1,3,2,1) reduceLeft((x,y) => x * y)

reduceLeft函数将使用左侧的2个元素,并替换为函数(x,y) => x * y的结果。

在你的情况下

列表(1,3,2,1)=>取(1,3)并替换1 * 3 = 3新列表:列表(3,2,1)
列表(3,2,1)=>取(3,2)并替换3 * 2 = 6新列表:(6,1)
最后取(6,1)并得到最终结果6。

当乘以1对产品没有影响时,我们在List之前添加数字1,以避免在List为空时出错。

删除它并尝试product(List()),你会看到。如果List至少在元素(1 :: xs)上对你的函数没有影响

答案 1 :(得分:0)

我相信你明白了。 (1 :: xs)只是表达List(1,3,2,1)的另一种方式,然后您可以在其上调用reduceLeft

至于更好地理解reduceLeft,我最近blogged this exact topic

答案 2 :(得分:0)

这不是前缀操作数 - 它是List实例上的method invocation。方法reduceLeft在List(1 :: xs)上被调用。

(1 :: xs) reduceLeft((x , y) => x * y)

也可以写成

(1 :: xs).reduceLeft((x , y) => x * y)

或者,更明确地说:

val myList = (1 :: xs)
myList.reduceLeft((x , y) => x * y)