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

エラーと依存性のチャネル

型付きエラーと環境です。

「エラーと依存性のチャネル」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。

強力な2つのチャネル

成功値に加えて、ZIO[R, E, A]は型付きエラーチャネルEと依存関係チャネルRを追跡します。どちらも型に現れるため、失敗と必要な依存関係がコンパイル時に明示されます。

型付きエラー

ドメイン上の失敗をsealedな階層としてモデル化し、それをEに指定します。するとコンパイラーが、該当するケースをすべて処理するよう強制します。

import zio._

sealed trait AppError
case object NotFound extends AppError
case object Forbidden extends AppError

val lookup: IO[AppError, String] = ZIO.fail(NotFound)

catchAllによるリカバリー

catchAllは新しいエフェクトを提供することで、Eに含まれるすべてのエラーを処理します。すべて処理した後は、エラーチャネルをNothingにできます。

import zio._

val safe: UIO[String] =
  ZIO.fail("boom").catchAll(e => ZIO.succeed(s"recovered: $e"))

catchSomeとorElse

catchSomeは一致するエラーだけを回復します。orElseは、失敗した場合に別のエフェクトへフォールバックします。

import zio._

val prog = ZIO.fail("x").orElse(ZIO.succeed("fallback"))

Eitherとfold

eitherはZIO[R, E, A]をZIO[R, Nothing, Either[E, A]]に変換します。foldはエラーと成功の両方を処理し、1つの値にまとめます。

import zio._

val label: UIO[String] =
  ZIO.fail(404).fold(e => s"err $e", v => s"ok $v")

DefectとFailureの違い

ZIOでは、failure(型付きで予期される失敗で、Eに含まれる)と、defect(予期しないthrowable)を区別します。ZIO.dieはdefectを発生させます。defectはE型には含まれず、バグを表します。

環境R

Rチャネルは、エフェクトが必要とするサービスを宣言します。ZIO.serviceでサービスにアクセスでき、依存関係が提供されるまで、その要件はRに現れます。

import zio._

trait Logger { def log(s: String): UIO[Unit] }

val prog: ZIO[Logger, Nothing, Unit] =
  ZIO.serviceWithZIO[Logger](_.log("hello"))

サービスの定義

サービスはtraitと、それを構築するZLayerで構成されます。Layerは依存関係の構築方法を記述し、それ自体が他のLayerに依存することもできます。

import zio._

case class ConsoleLogger() extends Logger {
  def log(s: String): UIO[Unit] = ZIO.succeed(println(s))
}
object ConsoleLogger {
  val layer: ULayer[Logger] = ZLayer.succeed(ConsoleLogger())
}

trait Logger { def log(s: String): UIO[Unit] }

依存関係の提供

provide(またはprovideLayer)はRの要件を満たし、ZIO[Logger, E, A]を実行可能なZIO[Any, E, A]に変換します。

import zio._

val runnable: UIO[Unit] =
  ZIO.serviceWithZIO[Logger](_.log("hi"))
    .provide(ConsoleLogger.layer)

trait Logger { def log(s: String): UIO[Unit] }
object ConsoleLogger { val layer: ULayer[Logger] = ??? }

Layerの合成

Layerは++(結合)で水平方向に、>>>(一方のLayerの出力を別のLayerの入力として渡す)で垂直方向に合成し、完全な依存関係グラフを構築できます。

import zio._

// val appLayer = configLayer ++ (dbLayer >>> repoLayer)

通常のScalaによる基準実装

比較のため、手動でエラー処理を行う自己完結型のScalaプログラムを示します。ZIOは同じエラーを型に組み込み、Layerを通じて依存関係を注入します。

object Main {
  def main(args: Array[String]): Unit = {
    val result: Either[String, Int] = Left("NotFound")
    val msg = result.fold(e => s"err $e", v => s"ok $v")
    println(msg)
  }
}

クイックチェック

provideメソッドはZIO[Logger, E, A]に対して何を行いますか?

まとめ

次の2つの追加チャネルを扱いました。

  • エラー:型付きのE、catchAll、orElse、fold、defectとfailureの違い
  • 依存関係:R、サービス、ZLayer、provide、Layerの合成

次は、ZIOアプリケーションの実行です。

よくある質問

「エラーと依存性のチャネル」レッスンは無料ですか?

はい。「エラーと依存性のチャネル」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。

「エラーと依存性のチャネル」で何を学びますか?

型付きエラーと環境です。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「エラーと依存性のチャネル」レッスンにはどのくらい時間がかかりますか?

ほとんどの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に戻る