هر یک از ما از والدین زیستی خود مجموعهای از دستورالعملهای شیمیایی را به ارث میبریم که با نام DNA شناخته میشوند و بر نحوهی ساخت بدن ما تأثیر میگذارند. همهی حیات شناختهشده به DNA وابسته است!
نکته: برای انجام این تمرین نیازی نیست چیزی دربارهی نوکلئوتیدها یا DNA بدانید.
DNA زنجیرهای بلند از مواد شیمیایی دیگر است و مهمترین آنها چهار نوکلئوتید هستند: آدنین، سیتوزین، گوانین و تیمین. یک زنجیرهی DNA میتواند میلیاردها عدد از این چهار نوکلئوتید را در خود داشته باشد و ترتیبی که این نوکلئوتیدها در آن ظاهر میشوند مهم است! ما به ترتیب این نوکلئوتیدها در بخشی از DNA، «توالی DNA» میگوییم.
یک توالی DNA را به صورت مجموعهای مرتب از این چهار نوکلئوتید نمایش میدهیم و روشی رایج برای این کار، استفاده از رشتهای از کاراکترها است؛ مثلاً «ATTACG» برای یک توالی DNA با ۶ نوکلئوتید. «A» برای آدنین، «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 ۲.۱۲، Either بهطور پیشفرض به سمت Right گرایش دارد، بنابراین برای عملیاتی مثل filter، map، flatMap یا داخل یک for-comprehension همانطور که انتظار دارید عمل میکند.
اگر با Either آشنا نیستید، میتوانید این آموزش را بخوانید. اما توجه داشته باشید که این آموزش مربوط به نسخههای Scala پیش از ۲.۱۲ است. برای Scala ۲.۱۲ میتوانید RightProjection را با خیال راحت نادیده بگیرید و .right را حذف کنید.
Either چیزی است که به آن موناد میگویند و یک «جنبهی محاسباتی» را در بر میگیرد؛ در اینجا منظور مدیریت خطاست.
استفادهی درست از مونادها میتواند به کدی بسیار مختصر و در عین حال زیبا و خوانا منجر شود. استفادهی نادرست بهراحتی نتیجهی برعکس میدهد.
برای یادگیری بیشتر این ویدیو را تماشا کنید.
چند قاعدهی سرانگشتی برای Either وجود دارد:
def add1(x: Int): Either[String, Int] = Right(x + 1)
بهتر است این را بنویسید
def add1(x: Int): Int = x + 1
(برای اعمال چنین توابع سادهای Either.map وجود دارد، پس لازم نیست آنها را با Either شلوغ کنید).
isLeft/isRight یا تطبیق الگو هستند. برای مثال، بهجای این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