gpt4 book ai didi

scala - 如何解释scaladoc?

转载 作者:行者123 更新时间:2023-12-01 08:19:45 28 4
gpt4 key购买 nike

foldRight[B](B)如何从 scaladoc 匹配实际调用 foldRight(0)
args 是字符串表示形式的整数数组

val elems = args map Integer.parseInt
elems.foldRight(0) (_ + _)

Scaladoc 说:
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].

f(an, z) 之后的句点是什么意思并不重要?

最佳答案

Steve表示,“...”只是省略号,表示未显示的可变数量的参数。

让我们转到 Scaladoc,并逐步显示此内容:

def foldRight[B](z: B)(op: (B, A) ⇒ B): B

这还不够显示。什么是 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

好的,所以 A是集合的类型。在您的示例中, A将代表 Int :
val elems = args map Integer.parseInt

接下来, [B] .那是一个类型参数。基本上,以下两个调用实际上是相同的,但第一个调用具有编译器推断的类型参数:
elems.foldRight(0) (_ + _)
elems.foldRight[Int](0) (_ + _)

如果您使用 0L而不是 0 ,然后 B将代表 Long反而。如果您通过了 ""而不是 0 ,然后 B将代表 String .你可以试试这些,它们都行。

所以, BIntz0 .请注意,声明中有两组括号。这意味着该函数是柯里化(Currying)的。它接收两组参数,以及类型参数( [B])。这意味着您可以省略第二组参数,这将返回一个函数,该函数采用第二组参数并返回预期结果。例如:
val elemsFolder: ((Int, Int) => Int) => Int = elems.foldRight(0)

然后你可以这样调用:
elemsFolder(_ + _)

无论如何,第二组收到 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
}

我希望这应该很容易理解。

关于scala - 如何解释scaladoc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2420959/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com