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
}
不使用scalaz
和var
,仅使用标准的scala库。
答案 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){_ + _}