如何在Scala中将fold实现为for-comprehension?我知道唯一的办法就是使用一些递归调用?这是一次失败的尝试,不确定该怎么做?将fold实现为for-comprehension的最佳方式是什么
val nums = List(1,2,3)
nums.fold(0)(_+_)
def recFold(acc: Int = 0): Int = {
(for {
a <- nums
b = recFold(a + acc)
} yield b).head
}
recFold(0) //Stack overflow发布于 2016-09-21 22:30:10
如果你真的想使用for,你不需要递归,但是你需要一个可变的变量:
val nums = List(1,2,3)
def recFold(zero: Int)(op: (Int, Int) => Int): Int = {
var result: Int = zero
for { a <- nums } result = op(result, a)
result
}
recFold(0)(_ + _) // 6这与foldLeft在TraversableOnce中的实际实现方式非常相似
def foldLeft[B](z: B)(op: (B, A) => B): B = {
var result = z
this foreach (x => result = op(result, x))
result
}发布于 2016-09-21 22:20:57
折叠可以从右到左或从左到右两种方式实现。不需要使用for加上递归。递归就足够了。
def foldRight[A, B](as: List[A], z: B)(f: (A, B) => B): B = {
as match {
case Nil => z
case x :: xs => f(x, foldRight(xs, z)(f))
}
}
@annotation.tailrec
def foldLeft[A, B](as: List[A], z: B)(f: (A, B) => B): B = {
as match {
case Nil => z
case x :: xs => foldLeft(xs, f(x, z))(f)
}
}https://stackoverflow.com/questions/39618657
复制相似问题