我正在阅读《 Scala编程》,但不理解为什么此折叠操作不正确:

val fruit = List("apples", "oranges", "lemons")
println( (0/:fruit)(_.length+_.length) )


我还尝试使用空字符串“”作为起始值-但这也没有编译:

println( (""/:fruit)(_.length+_.length) )

最佳答案

试试这个:

println( (0 /: fruit)(_ + _.length) )


传递的函数首先接收累加器(从初始值Int推断出的0)作为参数,然后接收集合的下一个元素(从String的类型推断出的fruit)作为参数。

参数的顺序很容易记住,因为它们对应于初始值和集合出现的顺序。在这里,初始值首先出现,因此,累加器作为第一个参数传递-作为第二个参数,您获得集合fruit的元素,该元素出现在方法名称/:之后。

如果改用foldRight,则可以方便地颠倒顺序:

println( (fruit :\ 0)(_.length + _) )

10-05 21:17
查看更多