Mindannyian örököljük a biológiai szüleinktől azokat a kémiai utasításokat, amelyeket DNS-nek nevezünk, és amelyek meghatározzák, hogyan épül fel a testünk. Minden ismert élet a DNS-től függ!
Megjegyzés: Nem kell semmit tudnod a nukleotidokról vagy a DNS-ről ahhoz, hogy megoldd ezt a feladatot.
A DNS más vegyületek hosszú lánca, amelyben a négy nukleotid a legfontosabb: az adenin, a citozin, a guanin és a timin. Egyetlen DNS-lánc több milliárd ilyen nukleotidot is tartalmazhat, és nagyon számít, milyen sorrendben követik egymást! A DNS egy szakaszán a nukleotidok sorrendjét „DNS-szekvenciának” nevezzük.
A DNS-szekvenciát úgy ábrázoljuk, hogy ezt a négy nukleotidot rendezett gyűjteményként kezeljük, amit általában karakterek egy string-jével adunk meg; egy 6 nukleotidból álló DNS-szekvenciát például az „ATTACG” ír le. Az 'A' az adenint, a 'C' a citozint, a 'G' a guanint, a 'T' pedig a timint jelöli.
Adott egy DNS-szekvenciát képviselő string; számold meg, hogy az egyes nukleotidokból mennyi található benne. Ha a string olyan karaktereket tartalmaz, amelyek nem A, C, G vagy T, akkor az érvénytelen, és hibát kell jelezned.
Például:
"GATTACA" -> 'A': 3, 'C': 1, 'G': 1, 'T': 2
"INVALID" -> error
Az Either gyakori használata, hogy olyan számítást jelöljünk vele, amely hibát eredményezhet
(ha a tényleges hiba nem érdekes, akkor az egyszerűbb Option típus jobb választás lehet).
Hiba hiányában az eredmény általában egy Right (emlékeztetőül: a »helyes« érték),
míg egy hiba egy Left, például egy Left[String], amely hibaüzenetet tartalmaz.
Jegyezd meg, hogy a Scala 2.12-ben az Either alapértelmezés szerint jobbra döntő, így a várt módon működik olyan műveleteknél, mint a filter, a map, a flatMap, vagy egy for-kifejezésben.
Ha nem ismered az Either-t, elolvashatod ezt az útmutatót. De vedd figyelembe, hogy ez az útmutató a 2.12 előtti Scala-verziókról szól. A Scala 2.12-ben nyugodtan figyelmen kívül hagyhatod a RightProjection-t, és elhagyhatod a .right-ot.
Az Either egy úgynevezett monád, amely egy »számítási aspektust« fed le,
jelen esetben a hibakezelést.
A monádok helyes használata nagyon tömör, mégis elegáns
és olvasható kódot eredményezhet. A helytelen használat könnyen az ellenkezőjét eredményezheti.
Nézd meg ezt a videót, hogy többet tudj meg.
Néhány ökölszabály vonatkozik az Either-re:
def add1(x: Int): Either[String, Int] = Right(x + 1)
jobb, ha ezt írod:
def add1(x: Int): Int = x + 1
(van Either.map, amellyel ilyen egyszerű függvényeket alkalmazhatsz,
így nem kell őket Either-rel teletűzdelned).
2. Ne »csomagold ki«, ha valóban nincs rá szükséged.
Gyakran vannak beépített függvények a célodra. A korai kicsomagolás jelei az isLeft/isRight vagy a mintaillesztés. Például ahelyett, hogy
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
}
jobb, ha ezt használod:
x fold (identity, _ + 1)
Either példányt szeretnél »összeállítani«. Ahelyett, hogyval 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)))
jobb, ha ezt használod:
for {
x <- xo
y <- yo
z <- zo
} yield x + y + z
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Scala nyelvet 95 feladat segítségével, valódi emberi mentorálással, mindez ingyen.