为什么可以插入(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 =
答案 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)