(Erlang'ı tanımıyorum ve Haskell yazamıyorum, ama yine de cevaplayabileceğimi düşünüyorum)
Bu röportajda rastgele sayı üretme kütüphanesi örneği verilmiştir. İşte olası durum bilgisi olan bir arayüz:
# create a new RNG
var rng = RNG(seed)
# every time we call the next(ceil) method, we get a new random number
print rng.next(10)
print rng.next(10)
print rng.next(10)
Çıktı olabilir 5 2 7
. Değişmezliği seven biri için bu yanlıştır! Olmalı 5 5 5
, çünkü yöntemi aynı nesne üzerinde çağırdık.
Vatansız bir arayüz ne olurdu? Rastgele sayılar dizisini next
, kafayı gerçekten ele aldığı tembel bir değerlendirme listesi olarak görüntüleyebiliriz :
let rng = RNG(seed)
let n : rng = rng in
print n
let n : rng = rng in
print n
let n : rng in
print n
Böyle bir arayüzle her zaman önceki bir duruma dönebiliriz. Kodunuzun iki parçası aynı RNG'ye başvuruyorsa, aslında aynı sayı dizisini alırlar. İşlevsel bir zihniyette bu oldukça arzu edilir.
Bunu durumsal bir dilde uygulamak o kadar da karmaşık değildir. Örneğin:
import scala.util.Random
import scala.collection.immutable.LinearSeq
class StatelessRNG (private val statefulRNG: Random, bound: Int) extends LinearSeq[Int] {
private lazy val next = (statefulRNG.nextInt(bound), new StatelessRNG(statefulRNG, bound))
// the rest is just there to satisfy the LinearSeq trait
override def head = next._1
override def tail = next._2
override def isEmpty = false
override def apply(i: Int): Int = throw new UnsupportedOperationException()
override def length = throw new UnsupportedOperationException()
}
// print out three nums
val rng = new StatelessRNG(new Random(), 10)
rng.take(3) foreach (n => println(n))
Bir liste gibi hissetmek için biraz sözdizimsel şeker eklediğinizde, bu aslında oldukça güzel.