为什么这个折叠不正确?

时间:2011-05-18 13:26:48

标签: scala

我正在阅读Scala编程,并且不明白为什么这种折叠操作不正确:

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

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

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

3 个答案:

答案 0 :(得分:8)

试试这个:

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

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

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

如果您改为使用foldRight,则可以方便地撤销订单:

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

答案 1 :(得分:6)

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

传递给fold的函数需要两个参数(acc, elem)的函数,其中acc是累加器,并且与种子0具有相同的类型,elem具有与列表元素的类型相同。

如果使用以下内容可能会更清楚:

(0 /: fruit){ (acc, elem) => acc + elem.length }

(编辑:我最初说的是元组,我已经改为两个参数的功能)

答案 2 :(得分:3)

foldLeft(或/ :)接受(作为第二个参数)一个带有两个参数的函数: 累加器和列表成员类型的变量。

所以,应该得到:

(0/:fruit)((acc:Int,el:String) => acc + el.length)

也就是说

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