地图和折叠的混合?

时间:2014-03-04 07:20:34

标签: scala

Scala中是否有一个函数,它是map和fold的混合体?我不想使用临时var变量。我想返回一个列表,同时能够有一个累加器。

更新

我想这样做

  def findMaxSubarray(source: Seq[Int]) = {
    var lastSum = 0
    val maxes = source map { x =>
      lastSum += x
      if (lastSum < 0) lastSum = 0
      lastSum
    }

    maxes.max
  }

不使用scalazvar,仅使用标准的scala库。

1 个答案:

答案 0 :(得分:3)

更新问题

您可以像这样使用scanLeft(或scan):

val seq = Stream.continually(util.Random.nextInt(200) - 100).take(100)
val maxes = seq.scan(0){ (lastSum, i) => (lastSum + i) max 0 }
maxes.max
// Int = 547

它生成foldLeft

的所有子结果的集合

初始问题

scalaz中有这样的方法:foldMap

(0 to 2).toList.foldMap{_ + 1}
// Int = 6

适用于幺半群,zero用作初始值:

(0 to 2).map{_ + 1}.fold(Monoid[Int].zero){_ |+| _}

标准scala库中没有这样的方法,但您可以在view之前使用map来避免创建中间集合:

(0 to 2).view.map{_ + 1}.fold(0){_ + _}