首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >foldLeft在Scala中的实现

foldLeft在Scala中的实现
EN

Stack Overflow用户
提问于 2014-06-15 17:28:26
回答 3查看 3.5K关注 0票数 4

TraversableOnce用可变var result实现foldLeft

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

我知道递归实现foldLeft是不实际的。现在我想知道是否有可能在没有可变变量的情况下有效地实现foldLeft

能办到吗?如果它不能呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-15 18:12:08

尾递归是你的朋友:

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

顺便说一下,TraversableOnce没有实现headtail,访问元素的唯一方法是使用foreach

票数 8
EN

Stack Overflow用户

发布于 2022-11-17 15:51:40

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

Stack Overflow用户

发布于 2014-06-15 18:15:30

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

https://stackoverflow.com/questions/24232235

复制
相关文章

相似问题

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