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