如何解读scaladoc?

sta*_*ker 3 scala

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)之后的时期是什么意思?

Dan*_*ral 6

正如史蒂夫所说,"......"只是省略号,表示可显示的可变数量的参数未显示.

让我们去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,那么BLong代替了.如果你通过了""代替0,那么B就代表了String.你可以尝试这些,他们都会工作.

所以,BIntz0.请注意,声明中有两组括号.这意味着该功能是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,第二个与集合类型相同 - 并返回与第一个参数相同类型的结果.由于这两个ABInt,这将是一个功能(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)

其中,我希望应该很容易理解.


ret*_*nym 5

您需要了解的所有内容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)