scala - 使用 for-complural 实现折叠

标签 scala

如何在 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

这与 foldLeftTraversableOnce 中的实际实现方式非常相似:

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/

相关文章:

scala - 如何避免使用 null?

scala - 如何将 Spark 的累加器传递给函数?

java - 如果一个对象不再发生变化,它是否可以安全地跨线程共享? (斯卡拉/ java )

scala - 在 Scala 元组赋值中使用 unicode 变量

algorithm - 在 Scala 中合并二叉树

scala - 如何从 Play 中的请求中获取 InputStream

Scala 编译器错误 : assertion failed: scala. <无>

scala - 数据框过滤器给出 NullPointerException

scala - 为什么在Scala中定义方法时添加了 ": Unit = "?

scala - 如何解决 SBT 中冲突的跨版本后缀?