Цепочка ответственности с частичными функциями Scala

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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

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

Ссылки

  • частичные функции scala без phd


Как скрестить http4s и ZIO? Поговорим об этом 22 июня на открытом уроке, который пройдет в рамках курса «Scala-разработчик». На этой встрече мы:
- узнаем oб основных компонентах REST-сервиса;
- сформируем представление о http4s (http-библиотека) и ZIO (библиотека асинхронного функционального эффекта);
- попрактикуемся в создании полноценного простого http-сервиса (сервер, эндпоинты, логика).

Урок подойдет всем, кто уже знаком со Scala и хочет писать веб-сервисы, используя наиболее популярные решения из экосистемы функционального программирования. Записаться на урок можно по ссылке.

Источник: https://habr.com/ru/companies/otus/articles/741704/


Интересные статьи

Интересные статьи

Для переноса IT-среды в облако используют технологии контейнеризации, в первую очередь Docker. Такой подход помогает оптимизировать потребление ресурсов и ещё больше автоматизировать операционные проц...
На настоящий момент судебную практику по статье 274.1. УК РФ объективно нельзя охарактеризовать как обширную. Введение данной статьи в уголовный закон было продиктовано необходимостью обеспечить надле...
Многие начинающие и не очень Scala разработчики принимают implicits как умеренно полезную возможность. Использование обычно ограничивается передачей ExecutionContext  во Future. Дру...
На митапе Сергей Рублев из DINS расскажет, как они с командой написали легковесную библиотеку с типизированными запросами в doobie-like стиле. Ахтям Сакаев из компании «М...
Всем привет! Для тех, кто мечтает стать Senior Developer и готов присоединиться к крутой команде Scala-разработчиков, с 1 по 15 декабря 2019 года мы запускаем отбор на бесплатный курс по обуче...