Распространённые классы типов
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 — локальная установка не требуется.
Все уроки этого курса
- Шаблон классов типов
- Определение экземпляров
- Распространённые классы типов
- Выведение классов типов