8

私は次のモデルを持っています

import monocle.macros.Lenses
import monocle.function.all._
import monocle.std.list._

@Lenses("_") case class Poll(pollChoices: List[PollChoice], totalVoteCount: Int)
@Lenses("_") case class PollChoice(id: Int, value: Int, percentage: Int)

私が達成しようとしているのは、pollChoices リスト内の各要素のすべてのパーセンテージ属性を更新することによって、Poll の pollChoices 属性を更新することです。私の問題は、新しいパーセンテージ値が PollChoice のvalue 属性と Poll の totalValueCount基づいいることです。

私がこれまでに行ったことは次のとおりです。

val poll = Poll(List(PollChoice(1,3,0), PollChoice(2,5,0)), 8)

(Poll._pollChoices composeTraversal each composeLens PollChoice._percentage)
  .modify(oldPercentage => oldPercentage + 1)(poll)

しかし、この方法では、変更ステップで更新している要素のパーセンテージ属性にしかアクセスできません。値も必要です。

この種の変更を行うには Traversable を使用する必要があると思いますが、方法がわかりません。ありがとう。

4

1 に答える 1

3

これはレンズ単体で表現できるとは思えませんが、中の別のレンズが.modifyうまく機能します。

Poll._pollChoices.composeTraversal(each).modify { choice =>
  PollChoice._percentage.set(choice.value / poll.totalVoteCount)(choice)
}(poll)
于 2016-12-16T13:25:21.213 に答える