कोटलिन में कार्यात्मक प्रोग्रामिंग: उन्नत स्तर
\n\nकोटलिन मूल रूप से एक बहु-प्रतिमान भाषा के रूप में बनाई गई थी, जो ऑब्जेक्ट-ओरिएंटेड और कार्यात्मक दृष्टिकोणों को स्वाभाविक रूप से जोड़ती है। उच्च-क्रम फलन, लैम्ब्डा अभिव्यक्तियाँ, डेटा अपरिवर्तनीयता (val) और एक शक्तिशाली प्रकार प्रणाली जैसी क्षमताओं के कारण, कोटलिन कार्यात्मक प्रोग्रामिंग (FP) की जटिल अवधारणाओं को लागू करने की अनुमति देता है। इस लेख में, हम कोटलिन में उन्नत FP तकनीकों पर चर्चा करेंगे जो आपको स्वच्छ, अधिक पूर्वानुमानित और परीक्षण योग्य कोड लिखने में मदद करेंगी।
\n\n1. फंक्टर और एप्लिकेटिव फंक्टर
\n\nफंक्टर एक डेटा संरचना है जो map ऑपरेशन का समर्थन करती है, जो संरचना के आकार को बनाए रखते हुए उसकी सामग्री पर एक फलन लागू करता है। कोटलिन में, मानक फंक्टर संग्रह और Option-जैसे प्रकार (जैसे T? या Result) हैं।
Result के लिए फंक्टर का कार्यान्वयन
\nResult प्रकार के साथ एक उदाहरण पर विचार करें, जो एक सफल मान या त्रुटि को समाहित करता है। हम map विधि को लागू करके एक फंक्टर बना सकते हैं:
sealed class Result<out T> {\n data class Success<T>(val value: T) : Result<T>()\n data class Error(val exception: Throwable) : Result<Nothing>()\n}\n\nfun <T, R> Result<T>.map(f: (T) -> R): Result<R> = when (this) {\n is Result.Success -> Result.Success(f(value))\n is Result.Error -> this // त्रुटि को संरक्षित करें\n}\n\n// उपयोग\nval result: Result<Int> = Result.Success(5)\nval mapped = result.map { it * 2 } // Result.Success(10)\n\n\nएप्लिकेटिव फंक्टर सामान्य फंक्टर की क्षमताओं का विस्तार करता है: यह एक ऐसे फलन को लागू करने की अनुमति देता है जो स्वयं एक संदर्भ (जैसे Result) के अंदर है, संदर्भ में एक मान पर। इसके लिए ap विधि का उपयोग किया जाता है।
fun <T, R> Result<(T) -> R>.ap(value: Result<T>): Result<R> = when (this) {\n is Result.Success -> value.map(f)\n is Result.Error -> this\n}\n\n// उदाहरण: दो परिणामों को संयोजित करना\nval add: (Int) -> (Int) -> Int = { a -> { b -> a + b } }\nval resultF: Result<(Int) -> (Int) -> Int> = Result.Success(add)\nval resultA: Result<Int> = Result.Success(3)\nval resultB: Result<Int> = Result.Success(7)\nval combined = resultF.ap(resultA).ap(resultB) // Result.Success(10)\n\n\n2. मोनैड: Option, Either और दुष्प्रभावों के साथ कार्य
\n\nमोनैड एक प्रकार है जो दो संक्रियाओं को लागू करता है: unit (एक मान को संदर्भ में रखना) और flatMap (मोनैडिक संक्रियाओं को जोड़ना)। कोटलिन में, T? (nullable प्रकार) को एक अंतर्निहित मोनैड माना जा सकता है, जहाँ unit केवल मान है, और flatMap ऑपरेटर ?.let या fold है।
Option मोनैड का कार्यान्वयन
\n\nsealed class Option<out T> {\n data class Some<T>(val value: T) : Option<T>()\n object None : Option<Nothing>()\n}\n\nfun <T, R> Option<T>.flatMap(f: (T) -> Option<R>): Option<R> = when (this) {\n is Option.Some -> f(value)\n is Option.None -> Option.None\n}\n\nfun <T> T.toOption(): Option<T> = Option.Some(this)\n\n// संक्रियाओं की श्रृंखला का उदाहरण\ndata class User(val id: Int, val name: String)\n\nfun findUser(id: Int): Option<User> = if (id == 1) Option.Some(User(1, "Alice")) else Option.None\nfun getEmail(user: User): Option<String> = Option.Some("${user.name}@example.com")\n\nval email = findUser(1).flatMap { getEmail(it) } // Option.Some("Alice@example.com")\n\n\nत्रुटि प्रबंधन के लिए Either मोनैड
\nOption के विपरीत, Either त्रुटि के बारे में जानकारी संग्रहीत करता है:
sealed class Either<out L, out R> {\n data class Left<L>(val value: L) : Either<L, Nothing>()\n