Pure funktionaler Zufallszahlengenerator - Statusmonade
Das Buch 'Funktionale Programmierung in Scala 'zeigt ein Beispiel für einen reinen funktionalen Zufallszahlengenerator wie folgt
trait RNG {
def nextInt: (Int, RNG)
}
object RNG {
def simple(seed: Long): RNG = new RNG {
def nextInt = {
val seed2 = (seed*0x5DEECE66DL + 0xBL) &
((1L << 48) - 1)
((seed2 >>> 16).asInstanceOf[Int],
simple(seed2))
}
}
}
Die Verwendung wird wie folgt aussehen:
val (randomNumber,nextState) = rng.nextInt
Ich bekomme den Teil, dass es eine reine Funktion ist, da es das @ zurückginext state und überlässt es dem API-Client, um es zum Aufrufen von @ zu verwendenextInt
das nächste Mal würde es eine Zufallszahl brauchen, aber was ich nicht verstanden habe, ist 'ie wird die erste Zufallszahl generier wie wir @ zur Verfügung stellen müssseed
zumindest einmal
Sollte es eine andere Funktion zum Heben gebenseed
um ein @ zu bekommRNG
? Und wenn ja, wie erwarten wir dann, dass der Client dieser API davon erfährt (da der Benutzer in der nicht funktionalen Implementierung nur @ aufruftnextInt
und der Zustand wird von der API gepflegt)
Kann jemand ein vollständiges Beispiel für einen reinen funktionalen Zufallszahlengenerator in Scala geben und ihn vielleicht allgemein mit dem Staat Monad in Verbindung bringen.