0Pricing
Scala for Backend Engineering & Functional Programming · レッスン

ZIO の合成

flatMap と for です。

「ZIO の合成」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これは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を持つ2つのエフェクトを合成すると、ZIOはE1 with E2の共通スーパータイプである最小上界を推論します。多くの場合、それはThrowableまたはsealed traitです。

zipとzipPar

zipは2つのエフェクトを逐次実行し、タプルにまとめます。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)は2つ目の結果を保持し、<*(zipLeft)は1つ目の結果を保持します。どちらもエフェクトを順番に実行します。

import zio._

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

foreach

ZIO.foreachはコレクションの各要素に対してエフェクトを実行し、結果を集めます。traverseと同様の処理です。

import zio._

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

foreachPar

ZIO.foreachParは各要素のエフェクトを並行実行します。複数のHTTPリクエストなど、I/Oの並列化に適しています。

import zio._

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

条件付きエフェクト

ZIO.whenは条件がtrueの場合にのみエフェクトを実行し、結果を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

合成したワークフロー

ここでは、for内包表記の中で小さなZIOステップだけを組み合わせ、合計値を計算して出力するワークフローを構築します。

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とループ

次は、エラーと依存関係のチャネルです。

よくある質問

「ZIO の合成」レッスンは無料ですか?

はい。「ZIO の合成」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、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時間対応のAIチューターがレッスンを進める中での質問に答えます。

Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン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に戻る