0

为什么可以(1 :: xs) 插入?一个是 cons'd 到列表 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 =
4

3 回答 3

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

在你的情况下

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

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

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

于 2013-09-17T21:37:08.517 回答
0

我相信你理解缺点就好了。 (1 :: xs)只是另一种表达方式List(1,3,2,1),然后调用它reduceLeft

至于更好的理解reduceLeft,我最近在博客上写了这个确切的话题

于 2013-09-17T21:23:30.900 回答
0

这不是前缀操作数——它是对 List 实例的方法调用。正在对 List (1 :: xs) 调用方法 reduceLeft。

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

也可以写成

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

或者,更明确地说:

val myList = (1 :: xs)
myList.reduceLeft((x , y) => x * y)
于 2013-09-17T21:24:55.973 回答