Ich habe versucht, die funktionale Programmierung in Scala zu lernen, und ich es endlich geschafft, zu verstehen, wie das mit Staat zu arbeiten für das Verständnis verwenden:Stateful Berechnungen in Scala mit Monaden
#!/usr/bin/env scala
case class State[A,S](run: S => (A,S)) {
def map[B](f: A => B): State[B,S] =
State(s => {
val (a, s1) = run(s)
(f(a), s1)
})
def flatMap[B](f: A => State[B,S]): State[B,S] =
State(s => {
val (a,s1) = run(s)
f(a).run(s1)
})
}
val increment = State[Unit,Int] {
x => ((),x+1)
}
val read = State[Int,Int] {
x => (x,x)
}
def prog = for {
_ <- increment
x <- read
_ <- increment
y <- read
} yield (x,y)
val ans = prog.run(0)._1
println(ans)
Obwohl diese fein läuft, Ich habe es nicht geschafft, etwas Ähnliches mit einer Zustands-Monade zu machen, es ist komplizierter als zB Option, weil es einen extra Typ braucht. Wie mache ich etwas Ähnliches wie dieser Code mit einer State Monade?
EDIT: Anscheinend war meine Frage nicht klar. Ich möchte dies mit einer Monade Eigenschaft laufen, wie diese, die ich von „Funktionale Programmierung in Scala“ nahm:
def stateMonad[S] = new Monad[({type lambda[x] = State[S,x]})#lambda] {
def unit[A](a: => A): State[S,A] = State(s => (a, s))
def flatMap[A,B](st: State[S,A])(f: A => State[S,B]): State[S,B] =
st flatMap f
}
Und dann die Berechnung durchführen, indem diese mit so etwas wie val M = stateMonad [Int] Instanziieren .
Konnte Frage nicht verstehen. Ihr Code ist die Umsetzung der staatlichen Monade. – Zernike
Ich habe die Frage bearbeitet, um es zu klären. –