[英]Implementation of foldLeft in Scala
TraversableOnce implements foldLeft
with mutable var result
. TraversableOnce使用可变
var result
实现foldLeft
。
def foldLeft[B](z: B)(op: (B, A) => B): B = {
var result = z
this foreach (x => result = op(result, x))
result
}
I understand that it is not practical to implement foldLeft
recursively.我知道递归地实现
foldLeft
是不切实际的。 Now I wonder if it is possible to implement foldLeft
without mutable variables efficiently.现在我想知道是否有可能在没有可变变量的情况下有效地实现
foldLeft
。
Can it be done?可以吗? Why if it cannot?
为什么不能呢?
Tail-recursion is your friend: 尾递归是你的朋友:
def foldLeft[A, B](xs: Seq[A], z: B)(op: (B, A) => B): B = {
def f(xs: Seq[A], acc: B): B = xs match {
case Seq() => acc
case x +: xs => f(xs, op(acc, x))
}
f(xs, z)
}
Btw, TraversableOnce
doesn't implement head
or tail
, the only way to access the elements is to use foreach
. 顺便说一句,
TraversableOnce
不实现head
或tail
,访问元素的唯一方法是使用foreach
。
object FoldImplement:
def myFoldLeft(lst: List[Int])(acc: Int)(f: (Int, Int)=>Int): Int =
lst match
case List() => acc
case hd::tl => myFoldLeft(tl)(f(hd,acc))(f)
@main def runFoldImpl =
println(myFoldLeft(List(1,3,5))(0)((acc,elem)=>acc+elem))
def foldLeft[B](z: B)(op: (B, A) => B): B = {
val thislist = this.toList
@tailrec
def myFold(result: B, list: List[A]): B = list match {
case Nil => result
case head :: tail => myFold(op(result,head), tail)
}
myFold(z, thislist)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.