Generador de números aleatorios funcionales puros - mónada estatal
El libro 'Programación Funcional en Scala'muestra un ejemplo de generador de números aleatorios funcionales puros como se muestra a continuación
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))
}
}
}
El uso se verá así
val (randomNumber,nextState) = rng.nextInt
Entiendo que es una función pura, ya que devuelve elsiguiente estado y lo deja en el cliente API para usarlo para llamarnextInt
la próxima vez necesitaría un número aleatorio, pero lo que no entendí es "¿Cómo se generará el primer número aleatorio? como debemos proporcionarseed
al menos una vez.
¿Debería haber otra función para levantarseed
conseguir unRNG
? Y si es así, ¿cómo esperamos que el cliente de esta API lo sepa (porque en la implementación no funcional el usuario solo llamanextInt
y el estado es mantenido por API)
¿Alguien puede dar un ejemplo completo de generador de números aleatorios funcionales puros en Scala y quizás relacionarlo con Monad en general?