(Saya tidak tahu Erlang, dan saya tidak bisa menulis Haskell, tapi saya pikir saya bisa menjawab demikian)
Nah, dalam wawancara itu contoh perpustakaan generasi nomor acak diberikan. Berikut ini adalah kemungkinan antarmuka stateful:
# 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)
Output mungkin 5 2 7
. Bagi seseorang yang menyukai kekekalan, ini jelas salah! Seharusnya 5 5 5
, karena kita memanggil metode pada objek yang sama.
Jadi apa yang akan menjadi antarmuka stateless? Kita dapat melihat urutan angka acak sebagai daftar malas yang dievaluasi, di mana next
sebenarnya mengambil kepala:
let rng = RNG(seed)
let n : rng = rng in
print n
let n : rng = rng in
print n
let n : rng in
print n
Dengan antarmuka seperti itu, kami selalu dapat kembali ke keadaan sebelumnya. Jika dua potong kode Anda merujuk ke RNG yang sama, mereka sebenarnya akan mendapatkan urutan angka yang sama. Dalam pola pikir fungsional, ini sangat diinginkan.
Menerapkan ini dalam bahasa stateful tidak begitu rumit. Sebagai contoh:
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))
Setelah Anda menambahkan sedikit gula sintaksis sehingga rasanya seperti daftar, ini sebenarnya cukup bagus.