Композиция ZIO
flatMap и for
«Композиция 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/foreachParwhen/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 — локальная установка не требуется.