2015-07-24 19 views
10

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 ettik

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()) 
    } 

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.

+1

Bu [cevap] (http://stackoverflow.com/a/7734876/5020846: Biz olarak kullanabileceğiniz Hangi

def diceRolls(n: Int) = State.sequence(List.fill(n)(roll)) 

: olarak

Şimdi bizim diceRolls fonksiyonunu tanımlayabiliriz) Scalaz 'State'i rastgele zar rulolarını kullanarak açıklar. –

cevap

İlgili konular