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 Combine में एसिंक्रोनस कॉल के साथ जटिल संरचना तक।

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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें