Monad الخاص بـIO
آثار نقية
Monad الخاص بـIO درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
ما هو IO؟
يمثّل IO[A] من Cats Effect وصفًا لحساب قد ينفّذ تأثيرات جانبية وينتج، عند تشغيله، قيمة من النوع A. وهو قيمة نقية — فلا يحدث شيء حتى تقوم بتشغيله.
تأجيل التأثيرات الجانبية
غلّف التأثير الجانبي باستخدام IO(...) أو IO.delay(...). لا يُنفَّذ جسم العملية عند إنشاء IO، بل عند تشغيله فقط.
import cats.effect.IO
val program: IO[Unit] = IO(println("Hello, IO!"))
// Nothing printed yet — program is just a descriptionالشفافية المرجعية
بما أن IO كسول، يمكنك استبدال قيمة IO بتعريفها من دون تغيير السلوك. وتجعل الشفافية المرجعية الشيفرة ذات التأثيرات أسهل في الفهم وإعادة الهيكلة.
القيم النقية
استخدم IO.pure لرفع قيمة حُسبت مسبقًا. لا تضع تأثيرات جانبية داخل pure — إذ يقيّمها فورًا. استخدم IO.delay أو IO(...) للتأثيرات.
import cats.effect.IO
val p: IO[Int] = IO.pure(42)
// 42 is computed already; pure just wraps itmap وas
تحوّل map نتيجة IO. أما as فتستبدلها بثابت. لا يشغّل أيٌّ منهما التأثير؛ بل ينشئان وصفًا أكبر.
import cats.effect.IO
val len: IO[Int] = IO("hello").map(_.length)
val done: IO[String] = IO(println("ran")).as("done")التشغيل باستخدام IOApp
لتنفيذ برنامج IO، مدّد IOApp ونفّذ run بحيث يعيد IO[ExitCode]. ويقيّم وقت التشغيل البرنامج على مجدول قائم على الألياف.
import cats.effect.{IO, IOApp, ExitCode}
object Main extends IOApp {
def run(args: List[String]): IO[ExitCode] =
IO(println("Running!")).as(ExitCode.Success)
}IOApp.Simple
بالنسبة إلى البرامج التي لا تتضمن معاملات أو رموز خروج مخصّصة، مدّد IOApp.Simple ووفّر run: IO[Unit].
import cats.effect.{IO, IOApp}
object Hello extends IOApp.Simple {
def run: IO[Unit] = IO.println("Hello, world!")
}IO.println
يوفّر Cats Effect الدالة IO.println للطباعة ذات التأثيرات بسهولة. وهي تعيد IO[Unit] ولا تطبع إلا عند تشغيلها.
import cats.effect.IO
val greet: IO[Unit] = IO.println("effectful output")التقاط الاستثناءات
إذا ألقى التأثير المغلّف استثناءً، يُلتقط الفشل داخل IO بدلًا من خروجه. وتصبح IO قيمة فاشلة يمكنك معالجتها لاحقًا.
import cats.effect.IO
val boom: IO[Int] = IO(throw new RuntimeException("fail"))
// Creating boom does NOT throw; running it wouldمقارنة مع Scala العادية
من دون نوع للتأثير، تُنفّذ التأثيرات الجانبية فورًا ويصعب تركيبها. يؤجل IO هذه التأثيرات، ولذلك تطبع برامج Scala المستقلة مباشرةً، بينما يؤجلها IO.
object Main {
def main(args: Array[String]): Unit = {
val eager = println("runs now") // executed immediately
println("second line")
}
}لماذا نستخدم IO؟
يوفّر لك IO ما يلي:
- النقاء — التأثيرات قيم
- قابلية التركيب — بناء البرامج من أجزاء صغيرة
- الأمان — تتبّع الأخطاء والموارد
- التزامن — ألياف خفيفة الوزن
اختبار سريع
متى يُنفّذ التأثير الجانبي داخل IO(println("hi")) فعليًا؟
مراجعة
يمثّل Monad IO التأثيرات كقيم نقية وكسولة:
- يؤجل
IO(...)/IO.delayالتأثيرات - يغلّف
IO.pureالقيم المحسوبة - يشغّل
IOApp/IOApp.Simpleالبرامج - تُلتقط الاستثناءات ولا تُلقى فورًا
التالي: تركيب عدة إجراءات IO معًا.
تعلم Scala مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 39
- الدروس
- 143
الأسئلة الشائعة
هل درس «Monad الخاص بـIO» مجاني؟
نعم — نص درس «Monad الخاص بـIO» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
ماذا ستتعلم في «Monad الخاص بـIO»؟
آثار نقية تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟
لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «Monad الخاص بـIO»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟
نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Type Classes في Cats
- Monad الخاص بـIO
- تركيب IO
- معالجة الأخطاء في IO