首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用for- Implement实现fold

使用for- Implement实现fold
EN

Stack Overflow用户
提问于 2016-09-21 21:55:55
回答 2查看 821关注 0票数 2

如何在Scala中将fold实现为for-comprehension?我知道唯一的办法就是使用一些递归调用?这是一次失败的尝试,不确定该怎么做?将fold实现为for-comprehension的最佳方式是什么

代码语言:javascript
复制
  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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-21 22:30:10

如果你真的想使用for,你不需要递归,但是你需要一个可变的变量:

代码语言:javascript
复制
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中的实际实现方式非常相似

代码语言:javascript
复制
def foldLeft[B](z: B)(op: (B, A) => B): B = {
  var result = z
  this foreach (x => result = op(result, x))
  result
}
票数 2
EN

Stack Overflow用户

发布于 2016-09-21 22:20:57

折叠可以从右到左或从左到右两种方式实现。不需要使用for加上递归。递归就足够了。

代码语言:javascript
复制
  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)
    }
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39618657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档