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

IO モナド

純粋なエフェクトです。

「IO モナド」は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レッスンが含まれています。

IOとは

Cats EffectのIO[A]は、実行すると副作用を実行し、型Aの値を生成する可能性がある計算の記述です。これは純粋な値であり、実行するまで何も起こりません。

副作用の遅延

副作用をIO(...)またはIO.delay(...)でラップします。IOの作成時には本体は実行されず、実行したときにだけ実行されます。

import cats.effect.IO

val program: IO[Unit] = IO(println("Hello, IO!"))
// Nothing printed yet — program is just a description

参照透過性

IOは遅延評価されるため、動作を変えずにIOの値をその定義で置き換えられます。この参照透過性により、副作用を含むコードの理解やリファクタリングが容易になります。

純粋な値

すでに計算済みの値を持ち上げるにはIO.pureを使います。pureの中に副作用を入れてはいけません。pureは即座に評価されるためです。副作用にはIO.delayまたはIO(...)を使います。

import cats.effect.IO

val p: IO[Int] = IO.pure(42)
// 42 is computed already; pure just wraps it

mapとas

mapはIOの結果を変換します。asは結果を定数に置き換えます。どちらもエフェクトを実行せず、より大きな記述を構築します。

import cats.effect.IO

val len: IO[Int] = IO("hello").map(_.length)
val done: IO[String] = IO(println("ran")).as("done")

IOAppでの実行

IOプログラムを実行するには、IOAppを拡張してrunを実装し、IO[ExitCode]を返します。ランタイムはファイバーを基盤とするスケジューラー上で評価します。

import cats.effect.{IO, IOApp, ExitCode}

object Main extends IOApp {
  def run(args: List[String]): IO[ExitCode] =
    IO(println("Running!")).as(ExitCode.Success)
}

IOApp.Simple

引数や独自の終了コードが不要なプログラムでは、IOApp.Simpleを拡張し、run: IO[Unit]を提供します。

import cats.effect.{IO, IOApp}

object Hello extends IOApp.Simple {
  def run: IO[Unit] = IO.println("Hello, world!")
}

IO.println

Cats Effectは、便利なエフェクト付きの出力としてIO.printlnを提供します。これはIO[Unit]を返し、実行したときにだけ出力します。

import cats.effect.IO

val greet: IO[Unit] = IO.println("effectful output")

例外の捕捉

ラップしたエフェクトが例外をスローすると、その失敗は外部に伝播せず、IOの内部に捕捉されます。IOは失敗した値になり、後から処理できます。

import cats.effect.IO

val boom: IO[Int] = IO(throw new RuntimeException("fail"))
// Creating boom does NOT throw; running it would

通常のScalaとの比較

エフェクト型がない場合、副作用はすぐに実行され、組み合わせるのが困難です。IOは副作用を遅延させるため、自己完結したScalaプログラムが即座に出力するのに対し、IOでは出力が遅延されます。

object Main {
  def main(args: Array[String]): Unit = {
    val eager = println("runs now") // executed immediately
    println("second line")
  }
}

IOを使う理由

IOには次の利点があります。

  • 純粋性 — エフェクトが値になる
  • 合成可能性 — 小さな部品からプログラムを構築できる
  • 安全性 — エラーとリソースが追跡される
  • 並行性 — 軽量なファイバーを利用できる

クイックチェック

IO(println("hi"))内の副作用は、実際にはいつ実行されますか?

まとめ

IOモナドは、エフェクトを純粋で遅延評価される値としてモデル化します。

  • IO(...) / IO.delayはエフェクトの実行を遅延させる
  • IO.pureは計算済みの値をラップする
  • IOApp / IOApp.Simpleはプログラムを実行する
  • 例外は即座にスローされず、捕捉される

次は、複数のIOアクションを組み合わせる方法です。

よくある質問

「IO モナド」レッスンは無料ですか?

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

「IO モナド」で何を学びますか?

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

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

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

「IO モナド」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?

はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Cats の型クラス
  2. IO モナド
  3. IO の合成
  4. IO のエラー処理
← Scala for Backend Engineering & Functional Programmingに戻る