foldRight[B](B)scaladoc 如何匹配实际调用foldRight(0)
args是字符串表示中的整数数组
val elems = args map Integer.parseInt
elems.foldRight(0) (_ + _)
Run Code Online (Sandbox Code Playgroud)
斯卡拉多克说:
scala.Iterable.foldRight[B](B)((A, B) => B) : B
Combines the elements of this list together using the binary function f, from right to left, and starting with the value z.
@note Will not terminate for infinite-sized collections.
@return f(a0, f(a1, f(..., f(an, z)...))) if the list is [a0, a1, ..., an].
Run Code Online (Sandbox Code Playgroud)
并不是那么重要f(an,z)之后的时期是什么意思?
正如史蒂夫所说,"......"只是省略号,表示可显示的可变数量的参数未显示.
让我们去Scaladoc,并逐步展示:
def foldRight[B](z: B)(op: (B, A) ? B): B
Run Code Online (Sandbox Code Playgroud)
这显示不够.什么是A?这是在Iterable类(或其定义的任何其他类)中定义的:
trait Iterable[+A] extends AnyRef // Scala 2.7
trait Iterable[+A] extends Traversable[A] with GenericTraversableTemplate[A, Iterable[A][A]] with IterableLike[A, Iterable[A]] // scala 2.8
Run Code Online (Sandbox Code Playgroud)
好的,A集合的类型也是如此.在你的例子中,A代表Int:
val elems = args map Integer.parseInt
Run Code Online (Sandbox Code Playgroud)
接下来,[B].这是一个类型参数.基本上,以下两个调用在实践中是相同的,但第一个具有由编译器推断的类型参数:
elems.foldRight(0) (_ + _)
elems.foldRight[Int](0) (_ + _)
Run Code Online (Sandbox Code Playgroud)
如果你用0L而不是0,那么B就Long代替了.如果你通过了""代替0,那么B就代表了String.你可以尝试这些,他们都会工作.
所以,B是Int和z是0.请注意,声明中有两组括号.这意味着该功能是curry.它接收两组参数,以及类型参数([B]).这意味着您可以省略第二组参数,并返回一个接受第二组参数的函数,并返回预期结果.例如:
val elemsFolder: ((Int, Int) => Int) => Int = elems.foldRight(0)
Run Code Online (Sandbox Code Playgroud)
你可以这样打电话:
elemsFolder(_ + _)
Run Code Online (Sandbox Code Playgroud)
无论如何,第二组接收op,预计是类型(B, A) => B.或者,换句话说,接收两个参数的函数 - 第一个与第一个类型相同z,第二个与集合类型相同 - 并返回与第一个参数相同类型的结果.由于这两个A和B是Int,这将是一个功能(Int, Int) => Int.如果你通过了"",那么它将是一个类型的函数(String, Int) => String.
最后,集合的返回类型是B,返回的类型是什么z类型foldRight.
至于如何foldRight工作,它有点像这样:
def foldRight[B](z: B)(op: (B, A) => B): B = {
var acc: B = z
var it = this.reverse.elements // this.reverse.iterator on Scala 2.8
while (!it.isEmpty) {
acc = op(acc, it.next)
}
return acc
}
Run Code Online (Sandbox Code Playgroud)
其中,我希望应该很容易理解.
您需要了解的所有内容foldLeft,foldRight可以从以下内容中收集:
scala> List("1", "2", "3").foldRight("0"){(a, b) => "f(" + a + ", " + b + ")"}
res21: java.lang.String = f(1, f(2, f(3, 0)))
scala> List("1", "2", "3").foldLeft("0"){(a, b) => "f(" + a + ", " + b + ")"}
res22: java.lang.String = f(f(f(0, 1), 2), 3)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
351 次 |
| 最近记录: |