Either ایک فنکشنل قسم ہے جو دو ممکنہ اقسام میں سے ایک قدر پیش کرتا ہے: غلطی کے لیے Left اور کامیابی کے لیے Right۔ مستثنیات کے برعکس، Either غلطی کے انتظام کو قسم کی سطح پر واضح بناتا ہے اور try-catch بلاکس کی ضرورت نہیں ہوتی۔ Arrow, 2026 کے مطابق، Either بڑے پیمانے پر Kotlin پروجیکٹس میں ان کارروائیوں کو مربوط کرنے کے لیے استعمال ہوتا ہے جو بغیر ضمنی اثرات کے ناکام ہو سکتی ہیں۔
اہم نکات
Either ایک الجبری ڈیٹا ٹائپ ہے، جو فنکشنل پروگرامنگ سے لیا گیا ہے، جو دو ممکنہ اقسام میں سے بالکل ایک قدر پیش کرتا ہے۔ غلطی کے انتظام کے تناظر میں، رواج یہ ہے: Left قسم (Left) مسئلے کی وضاحت رکھتی ہے، جبکہ Right قسم (Right) کامیاب نتیجہ رکھتی ہے۔
Either کا تصور Haskell زبان اور Either a b قسم کے زمرے سے شروع ہوا، جہاں a بائیں قدر کی قسم ہے اور b دائیں قدر کی قسم۔ موبائل ڈیولپمنٹ میں، Either نے Kotlin کے لیے Arrow لائبریری اور Swift میں فنکشنل طریقوں کی بدولت مقبولیت حاصل کی۔
مستثنیات پر Either کا بنیادی فائدہ پوشیدہ عملدرآمد کے راستوں کی عدم موجودگی ہے۔ Either لوٹانے والا فنکشن اپنے دستخط میں واضح طور پر اعلان کرتا ہے کہ یہ ناکام ہو سکتا ہے۔ مرتب کنندہ کنٹرول کرتا ہے کہ دونوں اقسام کو سنبھالا گیا ہے۔
مستثنیات پھینکنے کے برعکس، Either ڈیٹا کے بہاؤ کی شفافیت کو برقرار رکھتا ہے۔ Either لوٹانے والے فنکشن کو کال کرنے پر کالر کی طرف try-catch کی ضرورت نہیں ہوتی — pattern-matching یا fold کافی ہے۔ یہ خاص طور پر ردعمل کے نقطہ نظر والے فن تعمیر میں اہم ہے، جہاں ہر ڈیٹا ماخذ Either لوٹاتا ہے اور تبدیلی کی زنجیریں map اور flatMap کے ذریعے بنائی جاتی ہیں۔
Either دو ذیلی اقسام پر مشتمل ہے: Left اور Right۔ Either کی مثال کسی بھی لمحے ان میں سے صرف ایک ہو سکتی ہے۔ Kotlin میں عام دستخط Either<E, A> ہے، جہاں E غلطی کی قسم ہے اور A کامیاب قدر کی قسم۔
Left ناکامی کی صورت حال کو پیش کرتا ہے۔ مستثنیات کے برعکس، Left عملدرآمد کے بہاؤ میں خلل نہیں ڈالتا — یہ صرف ایک قدر لوٹاتا ہے جسے سنبھالنے کی ضرورت ہے۔ غلطی کی قسم کچھ بھی ہو سکتی ہے: String، Int، ایک حسب ضرورت sealed class یا ڈومین ماڈل۔
Right کارروائی کا صحیح نتیجہ رکھتا ہے۔ نام درستگی کو ظاہر کرتا ہے — رواج کے مطابق، Right کا مطلب کامیابی ہے۔ map اور flatMap جیسی تبدیلیاں Right پر لاگو ہوتی ہیں، جو ہر مرحلے کی جانچ کیے بغیر حساب کی زنجیریں بنانے کے قابل بناتی ہیں۔
flatMap Either کے انضمام کا بنیادی طریقہ کار ہے۔ اگر موجودہ قدر Right ہے، تو flatMap منتقل کردہ فنکشن کو لاگو کرتا ہے اور ایک نیا Either لوٹاتا ہے۔ اگر Left ہے، تو flatMap تبدیلی کو چھوڑ دیتا ہے اور غلطی کو آگے بڑھاتا ہے۔ اس رویے کو شارٹ سرکٹ ایویلیوایشن کہا جاتا ہے۔
flatMap کے علاوہ، Either mapLeft (غلطی کی تبدیلی کے لیے)، fold (ایک جگہ دونوں اقسام کو سنبھالنے کے لیے) اور getOrElse (ڈیفالٹ قدر کے ساتھ قدر نکالنے کے لیے) کی حمایت کرتا ہے۔ یہ فنکشن تمام منظرناموں کا احاطہ کرتے ہیں: سادہ نکالنے سے لے کر Kotlin کوروٹینز یا Swift کمبائن میں غیر مطابقت پذیر کالوں کے ساتھ پیچیدہ انضمام تک۔
fun parseInt(input: String): Either<String, Int> =
input.toIntOrNull()?.let { Right(it) }
?: Left("تبدیل نہیں کیا جا سکا: $input")
fun divide(a: Int, b: Int): Either<String, Int> =
if (b == 0) Left("صفر سے تقسیم")
else Right(a / b)
val result = parseInt("10")
.flatMap { divide(it, 2) }
Kotlin ماحولیاتی نظام میں، Either Arrow لائبریری میں لاگو کیا گیا ہے۔ Kotlin معیاری لائبریری Result پیش کرتی ہے، لیکن Either زیادہ لچک دیتا ہے: صوابدیدی غلطی کی قسم، flatMap کے ذریعے انضمام اور فنکشنل پیٹرن کے لیے حمایت۔
Arrow Kotlin کے لیے ایک فنکشنل لائبریری ہے جو Either، Option، Validated اور دیگر اقسام شامل کرتی ہے۔ Arrow.Either دو ذیلی طبقات کے ساتھ ایک sealed class ہے: ArrowCore.Left اور ArrowCore.Right۔ لائبریری آسان توسیعات بھی فراہم کرتی ہے: .getOrElse()، .fold()، .mapLeft()۔
ایک حقیقی منظر نامے پر غور کریں — ممکنہ غلطیوں کے ساتھ Android ایپ میں نیٹ ورک کی درخواست: نیٹ ورک نہ ہونا، سرور کی غلطی، غلط جواب۔ Either تمام اقسام کو ایک واپسی کی قسم میں یکجا کرنے کی اجازت دیتا ہے۔
sealed class NetworkError {
data class NoConnection(val message: String): NetworkError()
data class ServerError(val code: Int): NetworkError()
data class ParseError(val detail: String): NetworkError()
}
suspend fun fetchUser(id: String): Either<NetworkError, User> {
return try {
val response = api.getUser(id)
if (response.isSuccessful) {
Right(response.body()!!)
} else {
Left(NetworkError.ServerError(response.code()))
}
} catch (e: IOException) {
Left(NetworkError.NoConnection(e.message ?: ""))
}
}
Swift میں، ورژن 5.0 سے، بلٹ ان Result قسم دستیاب ہے جو تصوراتی طور پر Either سے ملتی جلتی ہے لیکن اس میں حدود ہیں: غلطی کو Error پروٹوکول کی تعمیل کرنی چاہیے، اور کامیاب قدر ایک ہی قسم کی ہونی چاہیے۔ Swift میں Either کو دو عام پیرامیٹرز کے ساتھ enum کے ذریعے لاگو کیا جاتا ہے۔
Result<Success, Failure> Swift کی بلٹ ان قسم ہے، جہاں Failure: Error۔ Either غلطی کی قسم پر کوئی پابندی عائد نہیں کرتا، جس سے String، حسب ضرورت ڈھانچے یا نیسٹڈ enums کے ذریعے متعدد غلطی کی اقسام کو ذخیرہ کیا جا سکتا ہے۔
enum Either<E, A> {
case left(E)
case right(A)
func map<B>(_ transform: (A) -> B) -> Either<E, B> {
switch self {
case .left(let e): return .left(e)
case .right(let a): return .right(transform(a))
}
}
}
let result: Either<String, Int> = .right(42)
let mapped = result.map { $0 * 2 }
Either ان منظرناموں کے لیے بہترین ہے جہاں مستثنیات کے بغیر واضح اور ٹائپ محفوظ غلطی کے انتظام کی ضرورت ہو۔ Kotlin اور Swift کے ساتھ موبائل ڈیولپمنٹ میں اہم استعمال کے معاملات پر غور کریں۔
بغیر ضمنی اثرات کے سادہ کارروائیوں کے لیے Either استعمال نہ کریں — عام واپسی کی قدر زیادہ قابل اعتماد اور پڑھنے میں آسان ہوتی ہے۔ Either اس وقت بھی ضرورت سے زیادہ ہے جب ناکامی ایک غیر معمولی صورت حال ہو نہ کہ متوقع منظر نامہ۔
Either Kotlin میں کوروٹینز کے ساتھ کام کرتے وقت بھی موثر ہے۔ Either لوٹانے والا فنکشن تھریڈ کو مسدود کیے بغیر fold یا mapLeft کے ذریعے غلطی کے انتظام کے ساتھ کوروٹین کے اندر بلایا جا سکتا ہے۔ یہ MVVM فن تعمیر والے Android ایپس میں خاص طور پر مفید ہے، جہاں ہر ریپوزٹری Either لوٹاتی ہے اور ViewModel نتیجہ کو UiState میں تبدیل کرتا ہے۔
Either سے پہلی بار واقف ہونے والے ڈیولپرز اکثر ایک جیسی غلطیاں کرتے ہیں۔ آئیے سب سے عام غلطیوں اور ان سے بچنے کے طریقوں کا جائزہ لیں۔
اکثر پوچھے گئے سوالات
Optional قدر کی موجودگی یا غیر موجودگی (Some/None) پیش کرتا ہے، لیکن غیر موجودگی کی وجہ نہیں بتاتا۔ Either دو ٹھوس اقسام دیتا ہے — غلطی کے لیے بائیں اور کامیابی کے لیے دائیں — جو ناکامی کا سیاق و سباق منتقل کرنے کی اجازت دیتا ہے۔
Java میں بلٹ ان Either نہیں ہے، لیکن Vavr اور functionaljava لائبریریاں نفاذ فراہم کرتی ہیں۔ Android ڈیولپمنٹ میں، Vavr کا Either lambdas کے ساتھ فنکشنل سٹائل کے لیے ایک مقبول متبادل ہے۔
Kotlin میں Sealed class اس وقت زیادہ آسان ہے جب دو سے زیادہ اقسام ہوں یا ان کی ساخت مختلف ہو۔ بائنری نتیجہ (غلطی/کامیابی) کے لیے، Either زیادہ کمپیکٹ ہے اور تیار فنکشنل کمبینیٹر فراہم کرتا ہے۔
Either ناقابل تغیر اور ڈیفالٹ طور پر تھریڈ محفوظ ہے۔ Kotlin میں کوروٹینز کے ساتھ، Either بہترین طور پر یکجا ہوتا ہے: flatMap کوروٹین اسکوپ کے اندر کام کرتا ہے اور غلطی کے انتظام کے لیے لاک کی ضرورت نہیں ہوتی۔
نہیں۔ Either متوقع ناکامیوں (نیٹ ورک، توثیق، کاروباری منطق) والی کارروائیوں کے لیے موزوں ہے۔ بغیر ضمنی اثرات کے سادہ گیٹرز اور حسابات کے لیے، عام قسم پڑھنے میں آسان ہوتی ہے اور غیر ضروری پیچیدگی نہیں بڑھاتی۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں