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

IO の合成

エフェクトを順序付けます。

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

flatMapによる順序付け

IOはモナドなので、flatMapでエフェクトを組み合わせます。各ステップは順番に実行され、後続のステップは先行するステップの結果を利用できます。

import cats.effect.IO

val program: IO[Unit] =
  IO("Alice").flatMap(name => IO.println(s"Hello, $name"))

for内包表記

for内包表記はflatMap/mapにデシュガーされ、純粋性を保ちながら命令型のスクリプトのように読めます。

import cats.effect.IO

val prog: IO[Unit] = for {
  _    <- IO.println("What is your name?")
  name <- IO("Bob")
  _    <- IO.println(s"Hi $name")
} yield ()

順序は保持される

for内包表記内のエフェクトは、プログラムの実行時に上から下へ実行されます。コードの構造が実行順序をそのまま表します。

独立したエフェクトの結合

2つのエフェクトが互いに依存しない場合は、mapNまたは(a, b).tupledで結合します。デフォルトでは順番に実行されますが、独立していることを表現できます。

import cats.effect.IO
import cats.syntax.apply._

val combined: IO[Int] = (IO(2), IO(3)).mapN(_ + _)

エフェクトの並列実行

parMapN(cats.syntax.parallelから提供)を使うと、独立したエフェクトを別々のファイバー上で同時に実行し、結果を結合できます。

import cats.effect.IO
import cats.syntax.parallel._

val par: IO[Int] = (IO(2), IO(3)).parMapN(_ + _)

結果の破棄

*>を使うとエフェクトを実行して2番目の結果を保持でき、<*を使うと1番目の結果を保持できます。voidは結果を完全に破棄し、IO[Unit]を生成します。

import cats.effect.IO

val r1: IO[Int]  = IO.println("log") *> IO(42)
val r2: IO[Unit] = IO(99).void

エフェクトの繰り返し

replicateA(n)はエフェクトをn回実行し、結果をリストに集めます。foreverMは無期限に繰り返します。

import cats.effect.IO

val three: IO[List[Unit]] = IO.println("tick").replicateA(3)

Listの走査

traverseを使うと、List[A]をList[B]に対するエフェクトへ変換できます。各要素がIOを生成し、その結果が集められます。

import cats.effect.IO
import cats.syntax.traverse._

val names = List("a", "b", "c")
val prog: IO[List[Unit]] = names.traverse(n => IO.println(n))

parTraverse

parTraverseはtraverseの並列版です。各要素のエフェクトが独自のファイバー上で実行されるため、多数のURLを取得するような並行I/Oに適しています。

import cats.effect.IO
import cats.syntax.parallel._

val ids = List(1, 2, 3)
val prog: IO[List[Int]] = ids.parTraverse(id => IO(id * 10))

合成されたプログラム

このプログラムは値を読み取り、2倍にして、結果を出力します。すべてが小さなIOステップから1つの記述として組み合わされています。

import cats.effect.{IO, IOApp}

object Doubler extends IOApp.Simple {
  def run: IO[Unit] = for {
    n <- IO(21)
    d  = n * 2
    _ <- IO.println(s"Doubled: $d")
  } yield ()
}

通常のScalaでの順序付け

比較のため、こちらは通常のScalaでのコンソール出力です。上の遅延評価されるIO版とは異なり、即座に実行され、副作用を伴います。

object Main {
  def main(args: Array[String]): Unit = {
    val n = 21
    val d = n * 2
    println(s"Doubled: $d")
  }
}

クイックチェック

独立した2つのエフェクトを同時に実行し、結果を結合するメソッドはどれですか?

まとめ

次の機能を使ってIOプログラムを組み合わせました。

  • 順序付けにはflatMapとfor
  • 独立したエフェクトにはmapN / parMapN
  • 結合や破棄には*>、<*、void
  • コレクションにはtraverse / parTraverse

次は、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は初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/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に戻る