2

のような署名を持つ関数はありますか

lensMapState[S, T, A](lens : Lens[S, T]): State[T, A] => State[S, A]

セマンティクスを使用して、選択した部分の変更を実行し、結果を取得します

1つの実装は

def lensMapState[S, T, A](lens: Lens[S, T]): State[T, A] => State[S, A] =
    stateT => State { s =>
      val (result, x) = stateT.run(lens.get(s))
      (lens.set(result)(s), x)
    } 

しかし、 monocleまたはscalaz.Lensを使用するより簡単な方法があれば?

4

1 に答える 1

2

あなたが探しているのは次のようなものだと思います:

import scalaz._
import Scalaz._

case class Person(name: String, age: Int)
case object Person {
  val _age = Lens.lensu[Person, Int]((p, a) => p.copy(age = a), _.age 
}

val state = for {
  a <- Person._age %= { _ + 1 } 
} yield a

state.run(Person("Holmes", 42))

その結果、

res0: scalaz.Id.Id[(Person, Int)] = (Person(Holmes,43),43)

https://github.com/scalaz/scalaz/blob/series/7.1.x/core/src/main/scala/scalaz/Lens.scalaで定義されている多くのレンズ/状態関連の関数があります。 Monocle は同様の原則に従います。私が知る限り、関連する関数は monocle.state で定義されています。

于 2015-11-20T10:14:58.453 に答える