Rasgele bir tamsayı oluşturmak için Scala'nın Rastgele sınıfıyla bir işlevsel Devlet temsilinin nasıl birleştirileceğini anlamaya çalışıyorum. Scala numaralı telefondan Fonksiyonel Programlama kitabından ders çalışıyorum ve kodun çoğu oradan alındı. Ben ne yapmak istediğiniziİşlevsel durumu kullanarak rasgele bir sayı nasıl oluştururum?
case class State[S, +A](run: S => (A, S))
Ve burada: Burada
Devlet sınıfı doğrudan kitaptan, böyle görünüyor ben harcanan saatleri nasıl anlamaya çalışıyorum ettikobject 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())
}
Devletin kurucusu ile çalışın ve istediğimi elde etmedim, dolayısıyla bu ilk üç yöntemin nasıl uygulanacağına dair neredeyse hiç bir anlayış eksikliği.
Amacım, diceRolls'u herhangi bir büyüklükte tamsayı ile ve herhangi bir başlangıç tohumu ile kullanabilmek ve hiç değişmeyen bir tamsayılar listesi oluşturabilmektir. Başka bir deyişle, diceRolls(3)
, List(3,3,2)
olabilir ve eğer öyleyse, diceRolls(7).take(3)
olarak yeniden yazmak, List(3,3,2)
'da tekrar sonuçlanmalıdır, vb.
Bu [cevap] (http://stackoverflow.com/a/7734876/5020846: Biz olarak kullanabileceğiniz Hangi
: olarak
Şimdi bizimdiceRolls
fonksiyonunu tanımlayabiliriz) Scalaz 'State'i rastgele zar rulolarını kullanarak açıklar. –