【发布时间】:2020-10-06 22:18:53
【问题描述】:
我有一个fold,它遍历元素,依赖地一一修改它们,同时修改它们的父元素。
目前我在fold 中一一替换其父元素中的元素,它们只是少数,这不是真正的性能问题,但我想知道是否有更好的方式来表达这一点。
case class Behavior(x: Int) {
def simulate(s: Entity): Behavior = copy(x = x + (if (s.alternate) 2 else 1))
}
case class Entity(alternate: Boolean, behaviors: List[Behavior]) {
def replaceBehavior(o: Behavior, n: Behavior): Entity = {
copy(behaviors = behaviors.patch(behaviors.indexOf(o), Seq(n), 1))
}
def toggleAlternate: Entity = copy(alternate = !alternate)
def simulate: Entity = {
behaviors.foldLeft(this) { (e, b) =>
e.replaceBehavior(b, b.simulate(e)).toggleAlternate
}
}
}
val entity = Entity(false, List(Behavior(10), Behavior(20), Behavior(30)))
entity.simulate
是否有一些操作或巧妙地使用scan 或类似的东西可以让我在一步中执行依赖于foldLeft 结果的foldLeft 和map? (我更喜欢 vanilla 标准 Scala 库,但也可以使用函数式框架)。
【问题讨论】:
-
在真实的代码中,
toggleAlternate是否读取了行为? -
在真实代码中
b.simulate生成更新的Behavior和更新的Entity
标签: scala collections functional-programming