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 itmapと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フィードバックを取得できます。ローカル設定は不要です。