Я пытаюсь выяснить, как объединить функциональное представление состояния с классом Scala Random для генерации случайных целых чисел. Я изучаю книгу "Функциональное программирование" в Scala, и поэтому большая часть кода берется оттуда.
Вот что выглядит класс State, непосредственно из книги:
case class State[S, +A](run: S => (A, S))
И вот что я хочу сделать:
object State {
type Rand[A] = State[A, Random] // the Random from scala.util.Random
def nextIntInRange(from: Int, to: Int): Rand[Int] =
??? _.nextInt(from - to) + from ??? // unsure about much of this
def get(a: Rand[A]): A = ??? // also unsure; should modify state
def getAndPreserveState(a: Rand[A]): A = ??? // ditto; should not modify state
def diceRolls(n: Int) = {
val roll = nextIntInRange(1, 6)
go(n: Int, acc: List[Int]): List[Int] = {
if (n >= 0) go(n-1, get(roll) :: acc) else acc
}
go(n, List())
}
Я потратил часы, пытаясь понять, как работать с конструктором State, и еще не достиг того, чего я хочу, следовательно, почти полное отсутствие понимания того, как реализовать эти первые три метода.
Моя цель - использовать diceRolls с любым размером целого и для любого заданного начального семестра и генерировать список целых чисел, которые никогда не изменяются. Другими словами, diceRolls(3)
может быть List(3,3,2)
, и если это так, переписывание его как diceRolls(7).take(3)
должно снова появиться в List(3,3,2)
и т.д.