繁体   English   中英

Map 并在 Scala 中折叠一个集合

[英]Map and fold a collection in Scala

我有一个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或类似的东西可以让我在一步中执行foldLeftmap依赖于foldLeft结果? (我更喜欢香草标准 Scala 库,但也可以使用功能框架)。

折叠( foldfoldLeftfoldRight ,...)通常将一些Collection[A]变成B

在将结果折叠到B之前,您可以在A上 map - foldMap映射A => B并假设存在Monoid[B] (这在Foldable类型类中的 Cats 中可用),因此您将执行转换Collection[A] --using f--> Collection[B] --using Monoid[B]--> B (代码可以优化它以在一个步骤中使用例如foldLeft在内部执行操作)。

颠倒操作的顺序——我们fold然后我们map通常是不可能的,因为没有什么可以让我们假设在fold步骤之后我们最终会得到一个Functor的东西。

根据您的具体用例,我们可能会尝试使用foldMap来实现您的目标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM