Scala for Backend Engineering & Functional Programming · درس

مقدمة إلى Functors وApplicatives

استوعب مفاهيم Functors لإجراء mapping على السياقات وApplicatives لدمج السياقات المستقلة

الدرس 1 من 311 خطوة

مقدمة إلى Functors وApplicatives درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 1 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 3 دروس في المجموع.

تجاوز القيم البسيطة

مرحبًا بكم في تعمّق أكبر في البرمجة الوظيفية! في Scala، نتعامل غالبًا مع قيم ليست «عادية» فحسب، بل تكون مغلّفة ضمن نوع من «السياق».

فكّروا في Option التي قد تحتوي على قيمة أو لا تحتوي عليها، أو في List التي تحتوي على قيم متعددة. كيف نتعامل مع هذه القيم من دون التحقق باستمرار من وجودها أو التكرار عبرها؟

القيم داخل صندوق: السياقات

ماذا نعني بـ«السياق»؟ إنه يشبه حاوية تضيف معنى أو سلوكًا إلى قيمة. من الأمثلة الشائعة في Scala:

  • Option[T]: قيمة قد تكون موجودة (Some(T)) أو غير موجودة (None).
  • List[T]: مجموعة من صفر أو أكثر من القيم.
  • Future[T]: قيمة ستصبح متاحة في وقت ما مستقبلًا.

تُعد Functors وApplicatives أدوات قوية للتعامل مع القيم الموجودة *داخل* هذه السياقات.

Functors: التحويل من الداخل

إن Functor نوع يعرف كيفية تطبيق دالة على قيمة *داخل* سياقها، من دون تغيير السياق نفسه.

تخيّلوا أنكم تحوّلون محتويات صندوق من دون تغيير الصندوق. العملية الأساسية في Functor هي map.

مثال على Functor: Option

يُعد النوع Option مثالًا كلاسيكيًا على Functor. تطبّق طريقته map دالةً فقط إذا كانت قيمة Option هي Some. أما إذا كانت None، فلا تُستدعى الدالة مطلقًا، وتُعاد None.

جرّبوا تشغيل هذا المثال:

object Main {
  def main(args: Array[String]): Unit = {
    val maybeNum = Some(5)
    val mappedNum = maybeNum.map(x => x * 2)
    println(s"Mapped Some: $mappedNum") // Some(10)

    val noNum: Option[Int] = None
    val mappedNoNum = noNum.map(x => x * 2)
    println(s"Mapped None: $mappedNoNum") // None
  }
}

مثال على Functor: List

وبالمثل، تُعد List أيضًا Functor. تطبّق طريقتها map دالةً على كل عنصر في القائمة، فتُنتج قائمة جديدة بالعناصر المحوّلة.

يتيح لكم ذلك تحويل جميع العناصر من دون كتابة حلقات تكرار صريحة!

object Main {
  def main(args: Array[String]): Unit = {
    val numbers = List(1, 2, 3)
    val doubled = numbers.map(x => x * 2)
    println(s"Doubled list: $doubled") // List(2, 4, 6)

    val emptyList = List.empty[Int]
    val mappedEmpty = emptyList.map(x => x * 2)
    println(s"Mapped empty: $mappedEmpty") // List()
  }
}

قوة `map`

لماذا تُعد Functors مهمة؟

  • التجريد: تخفي تفاصيل كيفية تطبيق دالة على قيمة داخل سياق. لا تحتاجون إلى if (option.isDefined) أو for (item <- list).
  • قابلية التركيب: يمكنكم تسلسل عدة استدعاءات لـmap لتنفيذ سلسلة من التحويلات بوضوح.
  • الأمان: بالنسبة إلى أنواع مثل Option، تتعامل map مع غياب القيمة بسلاسة.

Applicatives: أكثر من `map`

إن Applicatives مفهوم أكثر قوة يُبنى على Functors. فبينما تتيح لكم Functors تطبيق دالة عادية على قيمة داخل سياق، تتيح لكم Applicatives تطبيق دالة موجودة *هي أيضًا داخل سياق* على قيمة *داخل سياق*.

وتكون مفيدة خصوصًا عند دمج عدة قيم سياقية *مستقلة*.

رفع القيم إلى السياقات

تتمثل إحدى الميزات الأساسية لـApplicatives في القدرة على «رفع» قيمة عادية إلى الحد الأدنى من السياق. وفي مكتبة Scala القياسية، غالبًا ما تفعلون ذلك ببساطة من خلال إنشاء السياق.

فمثلًا، لوضع Int داخل سياق Option، ستستخدمون Some(value).

object Main {
  def main(args: Array[String]): Unit = {
    val value = 10
    val inOptionContext = Some(value) // Lifting 10 into Option
    println(s"Lifted to Option: $inOptionContext") // Some(10)

    val anotherValue = "Hello"
    val inListContext = List(anotherValue) // Lifting "Hello" into List
    println(s"Lifted to List: $inListContext") // List(Hello)
  }
}

دمج السياقات المستقلة

تتفوّق Applicatives في دمج عدة قيم سياقية مستقلة. فمثلًا، إذا كانت لديكم قيمتا Option وأردتم جمع محتوياتهما، تتيح لكم Applicative تنفيذ ذلك بسلاسة.

يمكن لتركيب for في Scala التعبير غالبًا عن أنماط Applicative بأسلوب أنيق، خصوصًا مع أنواع مثل Option وList.

object Main {
  def main(args: Array[String]): Unit = {
    val maybeX = Some(5)
    val maybeY = Some(10)

    // Combine maybeX and maybeY to sum their values
    val result = for {
      x <- maybeX
      y <- maybeY
    } yield x + y

    println(s"Combined result: $result") // Some(15)

    val maybeZ: Option[Int] = None
    val resultWithError = for {
      x <- maybeX
      z <- maybeZ
    } yield x + z

    println(s"Result with None: $resultWithError") // None
  }
}

تحقق سريع: Functors

اختبروا مدى فهمكم لـFunctors!

مراجعة Functors وApplicatives

استكشفنا في هذا الدرس:

  • السياقات: قيم مغلّفة داخل حاويات مثل Option أو List.
  • Functors: أنواع تتيح لكم تطبيق دالة باستخدام map على قيمة داخل سياق، فتحويل القيمة من دون تغيير السياق.
  • Applicatives: أقوى من Functors، إذ تتيح «رفع» القيم إلى سياق ودمج عدة قيم سياقية *مستقلة*.

تُعد هذه المفاهيم لبنات أساسية لبناء أنماط أكثر تقدمًا في البرمجة الوظيفية!

البدء مجانًا

تعلم Scala مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
39
الدروس
143

الأسئلة الشائعة

هل درس «مقدمة إلى Functors وApplicatives» مجاني؟

نعم — نص درس «مقدمة إلى Functors وApplicatives» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 3 دروس في المجموع.

ماذا ستتعلم في «مقدمة إلى Functors وApplicatives»؟

استوعب مفاهيم Functors لإجراء mapping على السياقات وApplicatives لدمج السياقات المستقلة تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟

لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 3.

كم من الوقت يستغرق درس «مقدمة إلى Functors وApplicatives»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟

نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مقدمة إلى Functors وApplicatives
  2. فهم Monads في Scala
  3. استكشاف Cats وZIO
← العودة إلى Scala for Backend Engineering & Functional Programming