Частичные функции

В этой статье мы рассмотрим фундаментальную, и вместе с тем очень полезную фичу 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 и хочет писать веб-сервисы, используя наиболее популярные решения из экосистемы функционального программирования. Записаться на урок можно по ссылке.

Комментарии (0)