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 Combine में एसिंक्रोनस कॉल के साथ जटिल संरचना तक।
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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें