आपका शरीर ऐसी कोशिकाओं से बना है जिनमें DNA होता है। ये कोशिकाएँ नियमित रूप से घिस जाती हैं और उन्हें बदलने की ज़रूरत पड़ती है। वे संतान कोशिकाओं में विभाजित होकर यह काम करती हैं। वास्तव में, एक औसत मानव शरीर में जीवनभर में लगभग 10 क्वाड्रिलियन कोशिका विभाजन होते हैं!
जब कोशिकाएँ विभाजित होती हैं, तो उनके DNA की भी प्रतिकृति बनती है। कभी-कभी इस प्रक्रिया में गलतियाँ हो जाती हैं और DNA के कुछ हिस्सों में गलत जानकारी भर जाती है। अगर हम DNA की दो शृंखलाओं की तुलना करें और उनके बीच के अंतर गिनें, तो पता चलता है कि कितनी गलतियाँ हुईं। इसे हैमिंग दूरी कहते हैं।
हैमिंग दूरी केवल जीव विज्ञान ही नहीं, विज्ञान के कई क्षेत्रों में काम आती है। इसलिए इस शब्द से परिचित होना अच्छा है :)
दो DNA स्ट्रैंड के बीच हैमिंग दूरी की गणना कीजिए।
हम DNA को C, A, G और T अक्षरों की मदद से पढ़ते हैं। दो स्ट्रैंड कुछ ऐसे दिख सकते हैं:
GAGCCTACTAACGGGAT
CATCGTAATGACGGCCT
^ ^ ^ ^ ^ ^^
इनमें 7 अंतर हैं, इसलिए हैमिंग दूरी 7 है।
हैमिंग दूरी केवल समान लंबाई वाले अनुक्रमों के लिए परिभाषित है, इसलिए अलग-अलग लंबाई वाले अनुक्रमों के बीच इसकी गणना करने की कोशिश काम नहीं करेगी।
Option का उपयोग ऐसी गणना दिखाने के लिए किया जाता है जिसका शायद कोई उपयोगी परिणाम न निकले
(जैसे किसी एरर या गलत इनपुट की वजह से)।
अगर आप Option से परिचित नहीं हैं, तो आप यह ट्यूटोरियल पढ़ सकते हैं।
Option एक तरह का मोनैड है, जो गणना के एक पहलू को समेटता है; यहाँ यह पहलू वैल्यू का संभवतः मौजूद न होना है।
मोनैड का सही उपयोग बहुत संक्षिप्त, फिर भी सुंदर
और पढ़ने में आसान कोड दे सकता है। गलत उपयोग से उलटा नतीजा आसानी से मिल सकता है।
और जानने के लिए यह वीडियो देखिए।
Option के लिए कुछ आम नियम हैं:
def add1(x: Int): Option[Int] = Some(x + 1)
यह लिखना बेहतर है
def add1(x: Int): Int = x + 1
(Option.map ऐसे सरल फंक्शन लगाने के लिए मौजूद है,
इसलिए आपको उन्हें Option से उलझाने की ज़रूरत नहीं)।
2. जब सचमुच ज़रूरत न हो, तो "unwrap" न कीजिए।
अक्सर आपके काम के लिए पहले से बने फंक्शन मौजूद होते हैं। समय से पहले
unwrap करने के संकेत हैं isDefined/isEmpty या पैटर्न मैचिंग। इसके बजाय
val x: Option[Int] = ...
if (x.isDefined) x.get + 1 else 0
// or
x match {
case Some(n) => n + 1
case None => 0
}
यह लिखना बेहतर है
x map (_ + 1) getOrElse 0
Option इंस्टेंस आपस में जोड़ना चाहते हैं। इसके बजायval xo: Option[Int] = ...
val yo: Option[Int] = ...
val zo: Option[Int] = ...
xo.flatMap(x =>
yo.flatMap(y =>
zo.map(z =>
x + y + z)))
यह लिखना बेहतर है
for {
x <- xo
y <- yo
z <- zo
} yield x + y + z