Το σώμα σου αποτελείται από κύτταρα που περιέχουν DNA. Αυτά τα κύτταρα φθείρονται τακτικά και χρειάζεται να αντικατασταθούν, κάτι που το καταφέρνουν διαιρούμενα σε θυγατρικά κύτταρα. Στην πραγματικότητα, το μέσο ανθρώπινο σώμα βιώνει περίπου 10 τετράκις εκατομμύρια κυτταρικές διαιρέσεις σε όλη τη διάρκεια της ζωής του!
Όταν τα κύτταρα διαιρούνται, αντιγράφεται και το DNA τους. Μερικές φορές, κατά τη διάρκεια αυτής της διαδικασίας, γίνονται λάθη και μεμονωμένα τμήματα DNA κωδικοποιούνται με λανθασμένες πληροφορίες. Αν συγκρίνουμε δύο κλώνους DNA και μετρήσουμε τις διαφορές μεταξύ τους, μπορούμε να δούμε πόσα λάθη συνέβησαν. Αυτό είναι γνωστό ως "Hamming distance".
Η "Hamming distance" είναι χρήσιμη σε πολλούς τομείς της επιστήμης, όχι μόνο στη βιολογία, οπότε είναι μια ωραία φράση για να την ξέρεις :)
Υπολόγισε την απόσταση Hamming ανάμεσα σε δύο κλώνους DNA.
Διαβάζουμε το DNA χρησιμοποιώντας τα γράμματα C, A, G και T. Δύο κλώνοι μπορεί να μοιάζουν κάπως έτσι:
GAGCCTACTAACGGGAT
CATCGTAATGACGGCCT
^ ^ ^ ^ ^ ^^
Έχουν 7 διαφορές, και επομένως η απόσταση Hamming είναι 7.
Η απόσταση Hamming ορίζεται μόνο για ακολουθίες ίσου μήκους, οπότε μια προσπάθεια υπολογισμού της ανάμεσα σε ακολουθίες διαφορετικού μήκους δε θα πρέπει να λειτουργεί.
Το Option χρησιμοποιείται για να δηλώσει έναν υπολογισμό που μπορεί να μην έχει κάποιο χρήσιμο αποτέλεσμα
(για παράδειγμα, λόγω κάποιου σφάλματος ή μη έγκυρης εισόδου).
Αν δεν είσαι εξοικειωμένος με το Option, μπορείς να διαβάσεις αυτό το σεμινάριο.
Το Option είναι ένα λεγόμενο Monad που καλύπτει μια "υπολογιστική πτυχή", στην περίπτωση αυτή την πιθανή απουσία μιας τιμής.
Η σωστή χρήση των Monads μπορεί να οδηγήσει σε πολύ συνοπτικό αλλά κομψό
και ευανάγνωστο κώδικα. Η ακατάλληλη χρήση μπορεί εύκολα να έχει το αντίθετο αποτέλεσμα.
Δες αυτό το βίντεο για να μάθεις περισσότερα.
Υπάρχουν μερικοί εμπειρικοί κανόνες για το Option:
def add1(x: Int): Option[Int] = Some(x + 1)
καλύτερα να έχεις
def add1(x: Int): Int = x + 1
(υπάρχει το Option.map για να εφαρμόζεις τέτοιες απλές συναρτήσεις,
οπότε δε χρειάζεται να τις γεμίζεις με Option).
2. Μην κάνεις "unwrap" αν δεν το χρειάζεσαι πραγματικά.
Συχνά υπάρχουν έτοιμες συναρτήσεις για τον σκοπό σου. Ενδείξεις πρόωρου
unwrapping είναι τα isDefined/isEmpty ή το pattern matching. Αντί για
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
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Scala με 95 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.