Καθένας από εμάς κληρονομεί από τους βιολογικούς του γονείς ένα σύνολο χημικών οδηγιών, γνωστό ως DNA, που καθορίζουν πώς δομείται το σώμα μας. Κάθε γνωστή μορφή ζωής εξαρτάται από το DNA!
Σημείωση: Δεν χρειάζεται να καταλάβεις τίποτα για τα νουκλεοτίδια ή το DNA για να ολοκληρώσεις αυτή την άσκηση.
Το DNA είναι μια μακριά αλυσίδα από άλλες χημικές ουσίες, και τα πιο σημαντικά από αυτά είναι τα τέσσερα νουκλεοτίδια: η αδενίνη, η κυτοσίνη, η γουανίνη και η θυμίνη. Μια μόνο αλυσίδα DNA μπορεί να περιέχει δισεκατομμύρια από αυτά τα τέσσερα νουκλεοτίδια, και η σειρά με την οποία εμφανίζονται έχει σημασία! Τη σειρά αυτών των νουκλεοτιδίων σε ένα κομμάτι DNA την ονομάζουμε "αλληλουχία DNA".
Αναπαριστούμε μια αλληλουχία DNA ως μια διατεταγμένη συλλογή αυτών των τεσσάρων νουκλεοτιδίων, και ένας συνηθισμένος τρόπος για να το κάνουμε αυτό είναι με μια συμβολοσειρά χαρακτήρων, όπως "ATTACG" για μια αλληλουχία DNA 6 νουκλεοτιδίων. 'Α' για την αδενίνη, 'C' για την κυτοσίνη, 'G' για τη γουανίνη και 'T' για τη θυμίνη.
Δεδομένης μιας συμβολοσειράς που αναπαριστά μια αλληλουχία DNA, μέτρησε πόσα από κάθε νουκλεοτίδιο υπάρχουν. Αν η συμβολοσειρά περιέχει χαρακτήρες που δεν είναι A, C, G ή T, τότε είναι άκυρη και θα πρέπει να σημάνεις ένα σφάλμα.
Για παράδειγμα:
"GATTACA" -> 'A': 3, 'C': 1, 'G': 1, 'T': 2
"INVALID" -> error
Μια συνηθισμένη χρήση του Either είναι να δηλώνει έναν υπολογισμό που μπορεί ενδεχομένως να καταλήξει σε σφάλμα
(αν το ίδιο το σφάλμα δεν σε ενδιαφέρει, τότε ο απλούστερος τύπος Option ίσως είναι καλύτερη επιλογή).
Όταν δεν υπάρχει σφάλμα, το αποτέλεσμα είναι συνήθως ένα Right (μνημονικό: η "σωστή" τιμή),
ενώ ένα σφάλμα είναι ένα Left, για παράδειγμα ένα Left[String] που περιέχει ένα μήνυμα σφάλματος.
Σημείωσε ότι στη Scala 2.12 το Either είναι right-biased εξ ορισμού, οπότε λειτουργεί όπως περιμένεις για πράξεις όπως filter, map, flatMap ή μέσα σε for-comprehension.
Αν δεν είσαι εξοικειωμένος με το Either, μπορείς να διαβάσεις αυτό το σεμινάριο. Να έχεις όμως υπόψη σου ότι αυτό το σεμινάριο αφορά εκδόσεις της Scala πριν από τη 2.12. Στη Scala 2.12 μπορείς να αγνοήσεις άφοβα το RightProjection και να παραλείψεις το .right.
Το Either είναι ένα λεγόμενο Monad που καλύπτει μια "υπολογιστική πτυχή",
στην περίπτωση αυτή τη διαχείριση σφαλμάτων.
Η σωστή χρήση των Monads μπορεί να δώσει πολύ περιεκτικό, αλλά συνάμα κομψό
και ευανάγνωστο κώδικα. Η λανθασμένη χρήση μπορεί εύκολα να φέρει το αντίθετο αποτέλεσμα.
Δες αυτό το βίντεο για να μάθεις περισσότερα.
Υπάρχουν μερικοί εμπειρικοί κανόνες για το Either:
def add1(x: Int): Either[String, Int] = Right(x + 1)
καλύτερα να έχεις
def add1(x: Int): Int = x + 1
(υπάρχει το Either.map για να εφαρμόζεις τέτοιες απλές συναρτήσεις,
ώστε να μη χρειάζεται να τις φορτώνεις με Either).
2. Μην κάνεις "unwrap" αν δεν το χρειάζεσαι πραγματικά.
Συχνά υπάρχουν έτοιμες συναρτήσεις για τον σκοπό σου. Ενδείξεις πρόωρου
unwrapping είναι τα isLeft/isRight ή το pattern matching. Για παράδειγμα, αντί για
val x: Either[String, Int] = ...
if (x.isRight) x.right.get + 1 else x.left.get
// or
x match {
case Right(n) => n + 1
case Left(s) => s
}
καλύτερα να έχεις
x fold (identity, _ + 1)
Either. Αντί γιαval xo: Either[String, Int] = ...
val yo: Either[String, Int] = ...
val zo: Either[String, 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 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.