gpt4 book ai didi

Scala foldLeft 而某些条件为真

转载 作者:行者123 更新时间:2023-12-04 23:12:28 24 4
gpt4 key购买 nike

如何在 Scala 中模拟以下行为?即在满足蓄能器的某些特定条件时继续折叠。

def foldLeftWhile[B](z: B, p: B => Boolean)(op: (B, A) => B): B

例如
scala> val seq = Seq(1, 2, 3, 4)
seq: Seq[Int] = List(1, 2, 3, 4)
scala> seq.foldLeftWhile(0, _ < 3) { (acc, e) => acc + e }
res0: Int = 1
scala> seq.foldLeftWhile(0, _ < 7) { (acc, e) => acc + e }
res1: Int = 6

更新:

根据@Dima 的回答,我意识到我的意图有点副作用。所以我让它与 takeWhile 同步,即如果谓词不匹配,则不会有任何进展。并添加更多示例以使其更清晰。 (注意:这不适用于 Iterator s)

最佳答案

首先,请注意您的示例似乎是错误的。如果我正确理解你的描述,结果应该是 1 (满足谓词 _ < 3 的最后一个值),而不是 6
最简单的方法是使用 return声明,这在 scala 中非常不受欢迎,但我想,为了完整起见,我会提到它。

def foldLeftWhile[A, B](seq: Seq[A], z: B, p: B => Boolean)(op: (B, A) => B): B = foldLeft(z) { case (b, a) => 
val result = op(b, a)
if(!p(result)) return b
result
}

由于我们想避免使用 return, scanLeft可能是一种可能性:
seq.toStream.scanLeft(z)(op).takeWhile(p).last

这有点浪费,因为它累积了所有(匹配)结果。
您可以使用 iterator而不是 toStream避免这种情况,但是 Iterator没有 .last出于某种原因,因此,您必须明确地扫描它额外的时间:
 seq.iterator.scanLeft(z)(op).takeWhile(p).foldLeft(z) { case (_, b) => b }

关于Scala foldLeft 而某些条件为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53728698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com