来自scaladoc的foldRight[B](B)如何匹配实际的调用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)之后的周期是什么意思?
发布于 2010-03-11 10:32:58
就像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。你可以试试这些,它们都会起作用的。
因此,B是Int,z是0。请注意,声明中有两组括号。这意味着该函数是curried的。它接收两组参数,beyond,以及类型参数([B])。这意味着你可以省略第二组参数,这将返回一个函数,该函数接受第二组参数,并返回预期的结果。例如:
val elemsFolder: ((Int, Int) => Int) => Int = elems.foldRight(0)然后你可以这样调用它:
elemsFolder(_ + _)无论如何,第二个集合接收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
}我希望这应该足够容易理解。
发布于 2010-03-11 06:15:23
您需要了解的有关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)https://stackoverflow.com/questions/2420959
复制相似问题