(আমি এরলংকে চিনি না, এবং আমি হাস্কেল লিখতে পারি না, তবে আমি মনে করি আমি তবুও উত্তর দিতে পারি)
ঠিক আছে, সেই সাক্ষাত্কারে একটি এলোমেলো সংখ্যা জেনারেশন লাইব্রেরির উদাহরণ দেওয়া হয়েছে। এখানে একটি সম্ভাব্য রাষ্ট্রীয় ইন্টারফেস:
# 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
এই জাতীয় ইন্টারফেসের সাহায্যে আমরা সর্বদা পূর্বের অবস্থায় ফিরে যেতে পারি। যদি আপনার কোডের দুটি টুকরা একই আরএনজিকে বোঝায়, তারা আসলে সংখ্যার একই ক্রম পাবে। কার্যক্ষম মানসিকতায় এটি অত্যন্ত কাম্য।
রাষ্ট্রীয় ভাষায় এটি প্রয়োগ করা এত জটিল নয়। উদাহরণ স্বরূপ:
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))
একবার আপনি কিছুটা সিনট্যাকটিক চিনি যুক্ত করুন যাতে এটি তালিকার মতো মনে হয়, এটি আসলে বেশ সুন্দর।