0Pricing
Scala for Backend Engineering & Functional Programming · درس

Type Classes الشائعة

Show وOrdering وNumeric

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

فئات الأنواع القياسية

تأتي مكتبة Scala القياسية بعدة فئات أنواع تستخدمونها يوميًا، أحيانًا من دون أن تدركوا ذلك:

  • Ordering[A] — كيفية مقارنة القيم.
  • Numeric[A] — العمليات الحسابية على الأعداد.
  • العرض بأسلوب Show (مخصص أو Show من Cats).

Ordering يمكّن sorted

تحتاج List.sorted إلى Ordering[A] ضمني. وتوفر المكتبة القياسية مثيلات للأعداد والسلاسل النصية وغيرها.

@main def run(): Unit = {
  println(List(3, 1, 2).sorted)
  println(List("pear", "apple", "fig").sorted)
}

Ordering مخصص

مرّروا Ordering صريحًا للفرز بطريقة مختلفة، مثل الترتيب التنازلي أو الترتيب حسب مفتاح مشتق.

@main def run(): Unit = {
  val nums = List(3, 1, 2)
  println(nums.sorted(Ordering.Int.reverse))
  val words = List("bbb", "a", "cc")
  println(words.sortBy(_.length))
}

Ordering لفئات الحالة

وفّروا مثيلًا من Ordering لنوعكم الخاص كي يمكن فرز المجموعات التي تحتوي عليه. وتشتق Ordering.by مثيلًا من مفتاح.

case class Person(name: String, age: Int)

object Main {
  implicit val byAge: Ordering[Person] = Ordering.by(_.age)

  def main(args: Array[String]): Unit = {
    val people = List(Person("A", 30), Person("B", 20))
    println(people.sorted)
  }
}

Numeric يجرّد العمليات الحسابية

يتيح لكم Numeric[A] كتابة دوال تعمل مع أي نوع عددي. وتعتمد sum على قائمة عليه.

@main def run(): Unit = {
  println(List(1, 2, 3).sum)
  println(List(1.5, 2.5).sum)
}

كتابة شيفرة حسابية عامة

باستخدام حد السياق [A: Numeric] يمكنكم جمع أي نوع عددي أو ضربه بطريقة عامة. استخدموا عمليات المثيل عبر Numeric[A].

object Main {
  def addAll[A: Numeric](xs: List[A]): A = {
    val num = implicitly[Numeric[A]]
    xs.foldLeft(num.zero)(num.plus)
  }

  def main(args: Array[String]): Unit = {
    println(addAll(List(1, 2, 3)))
    println(addAll(List(1.0, 2.0, 3.5)))
  }
}

عوامل Numeric

يمنحكم استيراد Implicits الخاص بالمثيل العوامل المعتادة (+ و*) على الأنواع العددية العامة، مما يجعل قراءة الشيفرة طبيعية.

object Main {
  def square[A](a: A)(implicit num: Numeric[A]): A = {
    import num._
    a * a
  }

  def main(args: Array[String]): Unit = {
    println(square(5))
    println(square(2.5))
  }
}

فئة الأنواع Show

تعرض Show القيم كنص بطريقة آمنة نوعيًا، بخلاف toString الموجودة في كل شيء. توفرها Cats؛ وإليكم نسخة مبسطة منها.

trait Show[A] { def show(a: A): String }

object Show {
  implicit val intShow: Show[Int] = n => s"Int($n)"
  def apply[A](implicit s: Show[A]): Show[A] = s
}

object Main {
  def main(args: Array[String]): Unit = {
    println(Show[Int].show(42))
  }
}

Ordering وmax/min

تستخدم أساليب مثل max وmin وmaxBy في المجموعات Ordering داخليًا.

@main def run(): Unit = {
  val xs = List(4, 9, 1, 7)
  println(xs.max)
  println(xs.min)
  println(List("a", "abc", "ab").maxBy(_.length))
}

دمج عمليات Ordering

يمكنكم بناء عمليات ترتيب مركبة باستخدام Ordering.by على صفيف، للفرز حسب حقل ثم حسب حقل آخر.

case class Rec(group: String, score: Int)

object Main {
  implicit val ord: Ordering[Rec] = Ordering.by(r => (r.group, -r.score))

  def main(args: Array[String]): Unit = {
    val data = List(Rec("b", 5), Rec("a", 1), Rec("a", 9))
    data.sorted.foreach(println)
  }
}

لماذا نستخدم فئات الأنواع هنا؟

لأن المقارنة والعمليات الحسابية فئتا أنواع، تعمل sorted أو sum نفسها مع الأنواع المضمّنة وأنواعكم الخاصة، وذلك بمجرد توفير مثيل. وهذه هي طريقة استخدام المكتبة القياسية للتعدد الشكلي الظرفي.

تحقق سريع

اختبروا معرفتكم بفئات الأنواع القياسية.

مراجعة

تعرّفتم إلى فئات الأنواع القياسية الشائعة:

  • تتحكم Ordering[A] في sorted وmax وmin؛ ويمكن بناؤها باستخدام Ordering.by.
  • تتيح Numeric[A] العمليات الحسابية العامة، وتدعم sum.
  • تعرض الفئات بأسلوب Show القيم بطريقة آمنة نوعيًا.

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

هل درس «Type Classes الشائعة» مجاني؟

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

ماذا ستتعلم في «Type Classes الشائعة»؟

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

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

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

كم من الوقت يستغرق درس «Type Classes الشائعة»؟

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

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

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

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

  1. نمط Type Class
  2. تعريف Instances
  3. Type Classes الشائعة
  4. اشتقاق Type Class
← العودة إلى Scala for Backend Engineering & Functional Programming