Either: جوہر، استعمال اور کام کرنے کا اصول

مصنف: IT Sectr اشاعت: 2026-05-26 مطالعے کا وقت: 8 منٹ

Either ایک فنکشنل قسم ہے جو دو ممکنہ اقسام میں سے ایک قدر پیش کرتا ہے: غلطی کے لیے Left اور کامیابی کے لیے Right۔ مستثنیات کے برعکس، Either غلطی کے انتظام کو قسم کی سطح پر واضح بناتا ہے اور try-catch بلاکس کی ضرورت نہیں ہوتی۔ Arrow, 2026 کے مطابق، Either بڑے پیمانے پر Kotlin پروجیکٹس میں ان کارروائیوں کو مربوط کرنے کے لیے استعمال ہوتا ہے جو بغیر ضمنی اثرات کے ناکام ہو سکتی ہیں۔

اہم نکات

  • Either دو باہمی مستثنی اقسام کو پیش کرنے کے لیے ایک الجبری ڈیٹا ٹائپ ہے: Left (غلطی) اور Right (کامیابی)۔
  • Left روایتی طور پر غلطی کی معلومات رکھتا ہے، Right صحیح قدر رکھتا ہے۔
  • واضح ٹائپنگ — Either مرتب وقت پر دونوں اقسام کو سنبھالنے پر مجبور کرتا ہے، غیر متوقع ناکامیوں کو ختم کرتا ہے۔
  • انضمام — Either بغیر نیسٹڈ جانچ کے تبدیلیوں کی زنجیروں کے لیے map، flatMap اور fold کی حمایت کرتا ہے۔
  • Result سے فرق — Either صرف Error یا Throwable نہیں، بلکہ کوئی بھی غلطی کی قسم ذخیرہ کر سکتا ہے۔

Either کیا ہے؟

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 دو ذیلی اقسام پر مشتمل ہے: Left اور Right۔ Either کی مثال کسی بھی لمحے ان میں سے صرف ایک ہو سکتی ہے۔ Kotlin میں عام دستخط Either<E, A> ہے، جہاں E غلطی کی قسم ہے اور A کامیاب قدر کی قسم۔

Left قسم: غلطی کا کنٹینر

Left ناکامی کی صورت حال کو پیش کرتا ہے۔ مستثنیات کے برعکس، Left عملدرآمد کے بہاؤ میں خلل نہیں ڈالتا — یہ صرف ایک قدر لوٹاتا ہے جسے سنبھالنے کی ضرورت ہے۔ غلطی کی قسم کچھ بھی ہو سکتی ہے: String، Int، ایک حسب ضرورت sealed class یا ڈومین ماڈل۔

Right قسم: کامیابی کا کنٹینر

Right کارروائی کا صحیح نتیجہ رکھتا ہے۔ نام درستگی کو ظاہر کرتا ہے — رواج کے مطابق، Right کا مطلب کامیابی ہے۔ map اور flatMap جیسی تبدیلیاں Right پر لاگو ہوتی ہیں، جو ہر مرحلے کی جانچ کیے بغیر حساب کی زنجیریں بنانے کے قابل بناتی ہیں۔

flatMap کے ذریعے Either کا انضمام

flatMap Either کے انضمام کا بنیادی طریقہ کار ہے۔ اگر موجودہ قدر Right ہے، تو flatMap منتقل کردہ فنکشن کو لاگو کرتا ہے اور ایک نیا Either لوٹاتا ہے۔ اگر Left ہے، تو flatMap تبدیلی کو چھوڑ دیتا ہے اور غلطی کو آگے بڑھاتا ہے۔ اس رویے کو شارٹ سرکٹ ایویلیوایشن کہا جاتا ہے۔

flatMap کے علاوہ، Either mapLeft (غلطی کی تبدیلی کے لیے)، fold (ایک جگہ دونوں اقسام کو سنبھالنے کے لیے) اور getOrElse (ڈیفالٹ قدر کے ساتھ قدر نکالنے کے لیے) کی حمایت کرتا ہے۔ یہ فنکشن تمام منظرناموں کا احاطہ کرتے ہیں: سادہ نکالنے سے لے کر Kotlin کوروٹینز یا Swift کمبائن میں غیر مطابقت پذیر کالوں کے ساتھ پیچیدہ انضمام تک۔

kotlin
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: عملی اطلاق

Kotlin ماحولیاتی نظام میں، Either Arrow لائبریری میں لاگو کیا گیا ہے۔ Kotlin معیاری لائبریری Result پیش کرتی ہے، لیکن Either زیادہ لچک دیتا ہے: صوابدیدی غلطی کی قسم، flatMap کے ذریعے انضمام اور فنکشنل پیٹرن کے لیے حمایت۔

Arrow لائبریری اور Either

Arrow Kotlin کے لیے ایک فنکشنل لائبریری ہے جو Either، Option، Validated اور دیگر اقسام شامل کرتی ہے۔ Arrow.Either دو ذیلی طبقات کے ساتھ ایک sealed class ہے: ArrowCore.Left اور ArrowCore.Right۔ لائبریری آسان توسیعات بھی فراہم کرتی ہے: .getOrElse()، .fold()، .mapLeft()۔

مثال: نیٹ ورک کی درخواست کے ساتھ Either

ایک حقیقی منظر نامے پر غور کریں — ممکنہ غلطیوں کے ساتھ Android ایپ میں نیٹ ورک کی درخواست: نیٹ ورک نہ ہونا، سرور کی غلطی، غلط جواب۔ Either تمام اقسام کو ایک واپسی کی قسم میں یکجا کرنے کی اجازت دیتا ہے۔

kotlin
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 میں Either: معیاری Result سے فرق

Swift میں، ورژن 5.0 سے، بلٹ ان Result قسم دستیاب ہے جو تصوراتی طور پر Either سے ملتی جلتی ہے لیکن اس میں حدود ہیں: غلطی کو Error پروٹوکول کی تعمیل کرنی چاہیے، اور کامیاب قدر ایک ہی قسم کی ہونی چاہیے۔ Swift میں Either کو دو عام پیرامیٹرز کے ساتھ enum کے ذریعے لاگو کیا جاتا ہے۔

معیاری Result بمقابلہ Either

Result<Success, Failure> Swift کی بلٹ ان قسم ہے، جہاں Failure: Error۔ Either غلطی کی قسم پر کوئی پابندی عائد نہیں کرتا، جس سے String، حسب ضرورت ڈھانچے یا نیسٹڈ enums کے ذریعے متعدد غلطی کی اقسام کو ذخیرہ کیا جا سکتا ہے۔

swift
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 کب استعمال کریں

Either ان منظرناموں کے لیے بہترین ہے جہاں مستثنیات کے بغیر واضح اور ٹائپ محفوظ غلطی کے انتظام کی ضرورت ہو۔ Kotlin اور Swift کے ساتھ موبائل ڈیولپمنٹ میں اہم استعمال کے معاملات پر غور کریں۔

  • نیٹ ورک کی درخواستیں — ہر درخواست کنکشن کی غلطی، سرور کی غلطی یا پارسنگ کی غلطی لوٹا سکتی ہے۔ Either تمام اقسام کو ایک قسم میں جمع کرتا ہے۔
  • فارم کی توثیق — حسب ضرورت غلطی کی قسم کے ساتھ Either ان پٹ فیلڈ کی توثیق کے نتائج (غلط ای میل یا پاس ورڈ) کو آسانی سے پیش کرتا ہے۔
  • ڈیٹا ریپوزٹری — Either ایک متحد غلطی کی قسم کے ساتھ مختلف ذرائع (کیشے، DB، نیٹ ورک) سے نتائج کو یکجا کرنے کی اجازت دیتا ہے۔
  • کمانڈ انٹرپریٹر — اگر ایپ صارف کے ان پٹ یا کمانڈز کو پارس کرتی ہے، تو Either غلطیوں کی اطلاع دینے کا ٹائپ محفوظ طریقہ فراہم کرتا ہے۔

بغیر ضمنی اثرات کے سادہ کارروائیوں کے لیے Either استعمال نہ کریں — عام واپسی کی قدر زیادہ قابل اعتماد اور پڑھنے میں آسان ہوتی ہے۔ Either اس وقت بھی ضرورت سے زیادہ ہے جب ناکامی ایک غیر معمولی صورت حال ہو نہ کہ متوقع منظر نامہ۔

Either Kotlin میں کوروٹینز کے ساتھ کام کرتے وقت بھی موثر ہے۔ Either لوٹانے والا فنکشن تھریڈ کو مسدود کیے بغیر fold یا mapLeft کے ذریعے غلطی کے انتظام کے ساتھ کوروٹین کے اندر بلایا جا سکتا ہے۔ یہ MVVM فن تعمیر والے Android ایپس میں خاص طور پر مفید ہے، جہاں ہر ریپوزٹری Either لوٹاتی ہے اور ViewModel نتیجہ کو UiState میں تبدیل کرتا ہے۔

Either کے ساتھ کام کرتے وقت عام غلطیاں

Either سے پہلی بار واقف ہونے والے ڈیولپرز اکثر ایک جیسی غلطیاں کرتے ہیں۔ آئیے سب سے عام غلطیوں اور ان سے بچنے کے طریقوں کا جائزہ لیں۔

  • Left کو نظر انداز کرنا — غلطی کی وجہ کا تجزیہ کیے بغیر ڈیفالٹ قدر کے ساتھ .getOrElse() کو کال کرنا Either کے استعمال کا مطلب ختم کر دیتا ہے۔ غلطی کو واضح طور پر سنبھالیں۔
  • عالمی غلطی کی قسم — پروجیکٹ میں تمام Either کے لیے مشترکہ قسم کے طور پر String یا Exception استعمال کرنا ٹائپ سیفٹی کو کم کرتا ہے۔ ڈومین sealed class بنائیں۔
  • نیسٹڈ Either — Right کے اندر Either (Either<E, Either<E, A>>) پڑھنے میں مشکل پیدا کرتا ہے۔ چپٹا کرنے کے لیے flatMap استعمال کریں۔
  • مستثنیات کے ساتھ ملاپ — فنکشن Either لوٹاتا ہے لیکن اندرونی طور پر مستثنیات پھینکتا ہے۔ یہ واضح غلطی کے انتظام کے خیال سے متصادم ہے۔

اکثر پوچھے گئے سوالات

Either Optional سے کیسے مختلف ہے؟

Optional قدر کی موجودگی یا غیر موجودگی (Some/None) پیش کرتا ہے، لیکن غیر موجودگی کی وجہ نہیں بتاتا۔ Either دو ٹھوس اقسام دیتا ہے — غلطی کے لیے بائیں اور کامیابی کے لیے دائیں — جو ناکامی کا سیاق و سباق منتقل کرنے کی اجازت دیتا ہے۔

کیا Java میں Either استعمال کیا جا سکتا ہے؟

Java میں بلٹ ان Either نہیں ہے، لیکن Vavr اور functionaljava لائبریریاں نفاذ فراہم کرتی ہیں۔ Android ڈیولپمنٹ میں، Vavr کا Either lambdas کے ساتھ فنکشنل سٹائل کے لیے ایک مقبول متبادل ہے۔

Either کی بجائے sealed class کب استعمال کرنی چاہیے؟

Kotlin میں Sealed class اس وقت زیادہ آسان ہے جب دو سے زیادہ اقسام ہوں یا ان کی ساخت مختلف ہو۔ بائنری نتیجہ (غلطی/کامیابی) کے لیے، Either زیادہ کمپیکٹ ہے اور تیار فنکشنل کمبینیٹر فراہم کرتا ہے۔

کیا Either ملٹی تھریڈنگ کو سپورٹ کرتا ہے؟

Either ناقابل تغیر اور ڈیفالٹ طور پر تھریڈ محفوظ ہے۔ Kotlin میں کوروٹینز کے ساتھ، Either بہترین طور پر یکجا ہوتا ہے: flatMap کوروٹین اسکوپ کے اندر کام کرتا ہے اور غلطی کے انتظام کے لیے لاک کی ضرورت نہیں ہوتی۔

کیا پروجیکٹ کے تمام فنکشنز کے لیے Either استعمال کرنا چاہیے؟

نہیں۔ Either متوقع ناکامیوں (نیٹ ورک، توثیق، کاروباری منطق) والی کارروائیوں کے لیے موزوں ہے۔ بغیر ضمنی اثرات کے سادہ گیٹرز اور حسابات کے لیے، عام قسم پڑھنے میں آسان ہوتی ہے اور غیر ضروری پیچیدگی نہیں بڑھاتی۔

خلاصہ

  • Either دو اقسام پیش کرنے کے لیے ایک فنکشنل قسم ہے: Left (غلطی) اور Right (کامیابی)، جو قسم کی سطح پر غلطی کے انتظام کو واضح بناتا ہے۔
  • Left معیاری Result کے برعکس، String سے ڈومین sealed class تک کوئی بھی غلطی کی قسم رکھ سکتا ہے۔
  • flatMap بغیر نیسٹڈ جانچ کے Either انضمام کو قابل بناتا ہے: غلطی خود بخود پوری زنجیر میں پھیل جاتی ہے۔
  • Arrow بلٹ ان کوروٹین سپورٹ اور ایکسٹینشنز کے ساتھ Kotlin کے لیے بنیادی Either لائبریری ہے۔
  • Swift بلٹ ان Result استعمال کرتا ہے، لیکن Either مکمل لچک کے لیے دو عام پیرامیٹرز کے ساتھ enum کے ذریعے لاگو کیا جا سکتا ہے۔
  • Either کو نیٹ ورک کی درخواستوں، فارم کی توثیق اور ریپوزٹریز کے لیے استعمال کریں — متوقع غلطیوں والے منظرنامے۔
  • عالمی غلطی کی اقسام، Left کو نظر انداز کرنے اور نیسٹڈ Either سے پرہیز کریں — یہ ٹائپ سیفٹی کے فوائد کو کم کرتے ہیں۔

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں