(ฉันไม่รู้ Erlang และฉันไม่สามารถเขียน Haskell ได้ แต่ฉันคิดว่าฉันสามารถตอบได้)
ในการสัมภาษณ์นั้นตัวอย่างของการสร้างห้องสมุดแบบสุ่มตัวเลขจะได้รับ นี่เป็นอินเทอร์เฟซที่เป็นไปได้:
# 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)
5 2 7
การส่งออกอาจจะ สำหรับคนที่ชอบความไม่เปลี่ยนรูปนี้เป็นสิ่งที่ผิดธรรมดา! มันควรจะเป็น5 5 5
เพราะเราเรียกว่าเมธอดบนวัตถุเดียวกัน
ดังนั้นอินเตอร์เฟสไร้สัญชาติจะเป็นอย่างไร เราสามารถดูลำดับของตัวเลขสุ่มเป็นรายการที่ได้รับการประเมินอย่างเกียจคร้านซึ่งnext
ดึงข้อมูลส่วนหัวได้จริง:
let rng = RNG(seed)
let n : rng = rng in
print n
let n : rng = rng in
print n
let n : rng in
print n
ด้วยอินเทอร์เฟซดังกล่าวเราสามารถเปลี่ยนกลับไปเป็นสถานะก่อนหน้าได้ตลอดเวลา หากรหัสสองชิ้นของคุณอ้างถึง RNG เดียวกันพวกเขาจะได้รับหมายเลขลำดับเดียวกัน ในความคิดเชิงหน้าที่สิ่งนี้เป็นที่ต้องการอย่างมาก
การใช้สิ่งนี้ในภาษาที่เป็นรัฐนั้นไม่ซับซ้อน ตัวอย่างเช่น:
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))
เมื่อคุณเพิ่มน้ำตาล syntactic เล็กน้อยเพื่อให้รู้สึกเหมือนเป็นรายการสิ่งนี้เป็นสิ่งที่ดีทีเดียว