首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解释scaladoc?

如何解释scaladoc?
EN

Stack Overflow用户
提问于 2010-03-11 06:02:33
回答 2查看 360关注 0票数 3

来自scaladoc的foldRight[B](B)如何匹配实际的调用foldRight(0)

args是字符串表示形式中的整数数组

代码语言:javascript
复制
val elems = args map Integer.parseInt
elems.foldRight(0) (_ + _)

Scaladoc说:

代码语言:javascript
复制
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)之后的周期是什么意思?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-11 10:32:58

就像Steve说的,"...“只是省略号,表示没有显示的可变数量的参数。

让我们转到Scaladoc,并逐步展示这一点:

代码语言:javascript
复制
def foldRight[B](z: B)(op: (B, A) ⇒ B): B

这还不够。什么是A?在Iterable类(或为其定义的任何其他类)中定义的:

代码语言:javascript
复制
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

代码语言:javascript
复制
val elems = args map Integer.parseInt

接下来是[B]。这是一个类型参数。基本上,以下两个调用在实践中是相同的,但第一个调用具有由编译器推断的类型参数:

代码语言:javascript
复制
elems.foldRight(0) (_ + _)
elems.foldRight[Int](0) (_ + _)

如果您使用0L而不是0,那么B将代表Long。如果您传递的是""而不是0,那么B将代表String。你可以试试这些,它们都会起作用的。

因此,BIntz0。请注意,声明中有两组括号。这意味着该函数是curried的。它接收两组参数,beyond,以及类型参数([B])。这意味着你可以省略第二组参数,这将返回一个函数,该函数接受第二组参数,并返回预期的结果。例如:

代码语言:javascript
复制
val elemsFolder: ((Int, Int) => Int) => Int = elems.foldRight(0)

然后你可以这样调用它:

代码语言:javascript
复制
elemsFolder(_ + _)

无论如何,第二个集合接收op,它应该是(B, A) => B类型的。或者,换句话说,一个函数接收两个参数--第一个参数的类型与z相同,第二个参数的类型与集合的类型相同--并返回与第一个参数相同类型的结果。因为AB都是Int,所以它将是(Int, Int) => Int的一个函数。如果您传递了"",那么它将是一个(String, Int) => String类型的函数。

最后,集合的返回类型是B,这意味着无论z的类型是什么,都将是foldRight返回的类型。

至于foldRight是如何工作的,它有点像这样:

代码语言:javascript
复制
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
}

我希望这应该足够容易理解。

票数 6
EN

Stack Overflow用户

发布于 2010-03-11 06:15:23

您需要了解的有关foldLeftfoldRight的所有信息都可以从以下内容中收集:

代码语言:javascript
复制
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)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2420959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档