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

Композиция ZIO

flatMap и for

Урок 2 из 413 шагов

«Композиция ZIO» — бесплатный урок Scala for Backend Engineering & Functional Programming на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Scala for Backend Engineering & Functional Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.

Последовательное выполнение с flatMap

ZIO — это монада, поэтому flatMap объединяет эффекты в цепочку, где каждый шаг может использовать результат предыдущего. Типы ошибок и окружения объединяются автоматически.

import zio._

val prog =
  ZIO.succeed(10).flatMap(n => Console.printLine(s"n = $n"))

for-композиция

Композиция for — идиоматичный способ последовательно выполнять эффекты ZIO. Код читается как императивный, сохраняя при этом чистоту.

import zio._

val prog = for {
  _    <- Console.printLine("Enter name:")
  name <- Console.readLine
  _    <- Console.printLine(s"Hello, $name")
} yield ()

Объединение типов ошибок

При объединении двух эффектов с разными типами ошибок E1 и E2 ZIO выводит наименьший общий супертип E1 with E2, часто Throwable или запечатанный трейт.

zip и zipPar

zip последовательно объединяет два эффекта в кортеж. zipPar выполняет их одновременно в отдельных волокнах.

import zio._

val seq: UIO[(Int, Int)] = ZIO.succeed(1).zip(ZIO.succeed(2))
val par: UIO[(Int, Int)] = ZIO.succeed(1).zipPar(ZIO.succeed(2))

zipRight и zipLeft

*> (zipRight) сохраняет второй результат, а <* (zipLeft) — первый. Оба оператора выполняют эффекты по порядку.

import zio._

val r = Console.printLine("log") *> ZIO.succeed(99)

foreach

ZIO.foreach выполняет эффект для каждого элемента коллекции и собирает результаты, подобно операции обхода.

import zio._

val prog = ZIO.foreach(List(1, 2, 3))(n => Console.printLine(n.toString))

foreachPar

ZIO.foreachPar одновременно выполняет эффект для каждого элемента — это особенно удобно для параллельных операций ввода-вывода, например нескольких HTTP-запросов.

import zio._

val ids = List(1, 2, 3)
val prog = ZIO.foreachPar(ids)(id => ZIO.succeed(id * 10))

Условные эффекты

ZIO.when выполняет эффект только тогда, когда условие истинно, возвращая Option с результатом. ZIO.unless действует наоборот.

import zio._

def logIf(debug: Boolean) =
  ZIO.when(debug)(Console.printLine("debugging"))

Циклы

ZIO.iterate и ZIO.loop создают циклы с эффектами. repeatN повторно выполняет эффект заданное число раз.

import zio._

val ticks = Console.printLine("tick").repeatN(2) // runs 3 times total

Составной рабочий процесс

В этом примере рабочий процесс вычисляет сумму и выводит её, полностью составляясь из небольших шагов ZIO в for-композиции.

import zio._

val workflow = for {
  a <- ZIO.succeed(20)
  b <- ZIO.succeed(22)
  _ <- Console.printLine(s"Sum: ${a + b}")
} yield ()

Эквивалент на чистой Scala

Та же логика на нетерпеливой чистой Scala для сравнения. ZIO откладывает эффекты и отслеживает их в системе типов, но выводит тот же результат.

object Main {
  def main(args: Array[String]): Unit = {
    val a = 20
    val b = 22
    println(s"Sum: ${a + b}")
  }
}

Быстрая проверка

Какой комбинатор одновременно выполняет эффект для каждого элемента списка?

Итоги

Вы составляли эффекты ZIO с помощью:

  • flatMap / for для последовательного выполнения
  • zip / zipPar, *>, <*
  • foreach / foreachPar
  • when / unless и циклов

Далее: каналы ошибок и зависимостей.

Можно начать бесплатно

Изучай Scala с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
39
Уроки
143

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

Урок «Композиция ZIO» бесплатный?

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

Чему я научусь в уроке «Композиция ZIO»?

flatMap и for Ты практикуешь Scala for Backend Engineering & Functional Programming с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Scala for Backend Engineering & Functional Programming?

Предыдущий опыт не требуется. Scala for Backend Engineering & Functional Programming на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Композиция ZIO»?

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

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

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

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

  1. Эффект ZIO
  2. Композиция ZIO
  3. Каналы ошибок и зависимостей
  4. Запуск приложений ZIO
← Назад к Scala for Backend Engineering & Functional Programming