0Pricing
Scala for Backend Engineering & Functional Programming · Урок

Распространённые классы типов

Show, Ordering, Numeric

«Распространённые классы типов» — бесплатный урок 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)))
  }
}

Числовые операторы

Импорт 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 преобразуют значения в текст с проверкой типов.

Часто задаваемые вопросы

Урок «Распространённые классы типов» бесплатный?

Да — полный текст урока «Распространённые классы типов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Scala for Backend Engineering & Functional Programming, подпишись на CoddyKit PRO. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.

Чему я научусь в уроке «Распространённые классы типов»?

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.

Сколько времени занимает урок «Распространённые классы типов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Scala for Backend Engineering & Functional Programming?

Да. Каждый урок Scala for Backend Engineering & Functional Programming включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Шаблон классов типов
  2. Определение экземпляров
  3. Распространённые классы типов
  4. Выведение классов типов
← Назад к Scala for Backend Engineering & Functional Programming