আমাদের প্রত্যেকে আমাদের জৈবিক পিতা-মাতার কাছ থেকে DNA নামে পরিচিত একগুচ্ছ রাসায়নিক নির্দেশনা পাই, যা আমাদের শরীর কীভাবে গড়ে ওঠে তা প্রভাবিত করে। পৃথিবীর সব পরিচিত প্রাণই DNA-র উপর নির্ভরশীল!
নোট: এই অনুশীলনীটি সম্পূর্ণ করতে নিউক্লিওটাইড বা DNA সম্পর্কে কিছু বোঝার দরকার নেই।
DNA হলো আরও অনেক রাসায়নিক পদার্থের একটি দীর্ঘ শৃঙ্খল, আর এর মধ্যে সবচেয়ে গুরুত্বপূর্ণ হলো চারটি নিউক্লিওটাইড: অ্যাডেনিন, সাইটোসিন, গুয়ানিন আর থাইমিন। একটি DNA শৃঙ্খলে এই চারটি নিউক্লিওটাইডের কোটি কোটি কপি থাকতে পারে, আর এগুলো যে ক্রমে থাকে সেটি গুরুত্বপূর্ণ! DNA-র একটি অংশে এই নিউক্লিওটাইডগুলোর যে ক্রম থাকে, তাকে আমরা বলি "DNA সিকোয়েন্স"।
আমরা একটি DNA সিকোয়েন্সকে এই চারটি নিউক্লিওটাইডের একটি সাজানো সংগ্রহ হিসেবে প্রকাশ করি, আর এটি করার একটি কমন উপায় হলো ক্যারেক্টারের একটি স্ট্রিং, যেমন ৬টি নিউক্লিওটাইডের একটি DNA সিকোয়েন্সের জন্য "ATTACG"। এখানে '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 2.12-এ Either ডিফল্টভাবে রাইট-বায়াসড, তাই filter, map, flatMap-এর মতো অপারেশন বা একটি ফর-কম্প্রিহেনশনে এটি প্রত্যাশামতো কাজ করে।
Either-এর সাথে যদি আপনার পরিচয় না থাকে, তাহলে আপনি এই টিউটোরিয়ালটি পড়তে পারেন। তবে মনে রাখবেন, এই টিউটোরিয়ালটি 2.12-এর আগের Scala ভার্সন নিয়ে। Scala 2.12-এর ক্ষেত্রে আপনি নিশ্চিন্তে RightProjection উপেক্ষা করতে পারেন এবং .right বাদ দিতে পারেন।
Either হলো তথাকথিত একটি মোনাড, যা একটি "গণনার দিক" নিয়ে কাজ করে,
এক্ষেত্রে এরর হ্যান্ডলিং।
মোনাড সঠিকভাবে ব্যবহার করলে কোড অত্যন্ত সংক্ষিপ্ত হয়েও সুন্দর
ও পড়ার উপযোগী হতে পারে। ভুল ব্যবহারে সহজেই এর উল্টোটা ঘটতে পারে।
আরও জানতে এই ভিডিওটি দেখুন।
Either-এর জন্য কয়েকটি সাধারণ নিয়ম আছে:
def add1(x: Int): Either[String, Int] = Right(x + 1)
ভালো হয়
def add1(x: Int): Int = x + 1
(এমন সরল ফাংশন প্রয়োগ করার জন্য Either.map আছে,
তাই সেগুলো Either দিয়ে জটিল করার দরকার নেই)।
2. সত্যিই দরকার না থাকলে আনর্যাপ করবেন না।
প্রায়ই আপনার উদ্দেশ্যের জন্য বিল্ট-ইন ফাংশন থাকে। সময়ের আগে
আনর্যাপ করার লক্ষণ হলো 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
Exercism-এ সাইন আপ করুন, Scala ট্র্যাকের 95টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।