如何在 Scala 中将 fold
实现为 for-compressive
?我看到唯一的方法是使用一些递归调用?这是一次失败的尝试,不知道该怎么做?将 fold
实现为 for-compressionion
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
最佳答案
如果你真的想使用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
}
关于scala - 使用 for-complural 实现折叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39618657/