Частичные функции
В этой статье мы рассмотрим фундаментальную, и вместе с тем очень полезную фичу Scala: частичные функции.
Частичная функция (в отличие от полной) — это функция, которая определена не для всех возможных входных данных. Частичная функция g: A => B — это функция, для которой существуют некоторые значения a в области A такие, что g(a) не определена. Scala имеет хорошую поддержку частичных функций.
Цепочка ответственности
На Devoxx France 2023 Эдсон Янага (Edson Yanaga) выступил с докладом, в котором он пересмотрел паттерны проектирования GoF, используя новые возможности Java. Вот его реализация паттерна "Цепочка ответственности". По ходу доклада я подумал, что в Scala это еще проще.
Для иллюстрации возьмем пример ката FizzBuzz.
Вот реализация на языке Scala:
object FizzBuzz extends App {
val multipleOfThree: PartialFunction[Int, String] = {
case i if i % 3 == 0 => "Fizz"
}
val multipleOfFive: PartialFunction[Int, String] = {
case i if i % 5 == 0 => "Buzz"
}
val multipleOfBoth: PartialFunction[Int, String] = {
case i if i % 3 == 0 && i % 5 == 0 => "FizzBuzz"
}
val default: PartialFunction[Int, String] = {
case i => i.toString
}
val fizzBuzz = List(multipleOfBoth, multipleOfThree, multipleOfFive, default)
.reduce(_ orElse _)
(1 to 100).foreach(i => println(fizzBuzz(i)))
}
Цепочка ответственности реализуется с помощью метода orElse для цепочки вызовов.
Я также часто использую данную технику для имплементации своей эвристики в соревнованиях по программированию ботов на codingame. Это позволяет мне легко менять приоритеты действий, просто поменяв порядок в списке.
Ссылки
Как скрестить http4s и ZIO? Поговорим об этом 22 июня на открытом уроке, который пройдет в рамках курса «Scala-разработчик». На этой встрече мы:
узнаем oб основных компонентах REST-сервиса;
сформируем представление о http4s (http-библиотека) и ZIO (библиотека асинхронного функционального эффекта);
попрактикуемся в создании полноценного простого http-сервиса (сервер, эндпоинты, логика).
Урок подойдет всем, кто уже знаком со Scala и хочет писать веб-сервисы, используя наиболее популярные решения из экосистемы функционального программирования. Записаться на урок можно по ссылке.