IO kombinieren
Effekte sequenzieren
IO kombinieren ist eine kostenlose Scala for Backend Engineering & Functional Programming-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Scala for Backend Engineering & Functional Programming-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Scala for Backend Engineering & Functional Programming-Kurs umfasst insgesamt 4 Lektionen.
Sequenzieren mit flatMap
Da IO eine Monade ist, kombinieren Sie Effekte mit flatMap. Jeder Schritt wird der Reihe nach ausgeführt, und ein späterer Schritt kann das Ergebnis eines früheren verwenden.
import cats.effect.IO
val program: IO[Unit] =
IO("Alice").flatMap(name => IO.println(s"Hello, $name"))for-comprehension
Eine for-comprehension wird in flatMap/map umgewandelt und liest sich wie ein imperatives Skript, bleibt dabei aber rein.
import cats.effect.IO
val prog: IO[Unit] = for {
_ <- IO.println("What is your name?")
name <- IO("Bob")
_ <- IO.println(s"Hi $name")
} yield ()Die Reihenfolge bleibt erhalten
Effekte in einer for-comprehension werden bei der Ausführung des Programms von oben nach unten ausgeführt. Die Struktur Ihres Codes entspricht der Ausführungsreihenfolge.
Unabhängige Effekte kombinieren
Wenn zwei Effekte nicht voneinander abhängen, verwenden Sie mapN oder (a, b).tupled, um sie zu kombinieren. Standardmäßig werden sie weiterhin nacheinander ausgeführt, drücken aber ihre Unabhängigkeit aus.
import cats.effect.IO
import cats.syntax.apply._
val combined: IO[Int] = (IO(2), IO(3)).mapN(_ + _)Effekte parallel ausführen
Verwenden Sie parMapN (aus cats.syntax.parallel), um unabhängige Effekte gleichzeitig auf separaten Fasern auszuführen und ihre Ergebnisse zu kombinieren.
import cats.effect.IO
import cats.syntax.parallel._
val par: IO[Int] = (IO(2), IO(3)).parMapN(_ + _)Ergebnisse verwerfen
Verwenden Sie *>, um einen Effekt auszuführen und das zweite Ergebnis zu behalten, oder <*, um das erste zu behalten. void verwirft das Ergebnis vollständig und liefert IO[Unit].
import cats.effect.IO
val r1: IO[Int] = IO.println("log") *> IO(42)
val r2: IO[Unit] = IO(99).voidEffekte wiederholen
replicateA(n) führt einen Effekt n-mal aus und sammelt die Ergebnisse in einer Liste. foreverM wiederholt ihn unbegrenzt.
import cats.effect.IO
val three: IO[List[Unit]] = IO.println("tick").replicateA(3)Eine List durchlaufen
Wandeln Sie mit traverse eine List[A] in einen Effekt über eine List[B] um. Jedes Element erzeugt ein IO, und die Ergebnisse werden gesammelt.
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 ist die parallele Variante von traverse – der Effekt jedes Elements wird auf einer eigenen Faser ausgeführt. Das ist ideal für nebenläufige Ein-/Ausgabe, etwa beim Abrufen vieler URLs.
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))Ein kombiniertes Programm
Dieses Programm liest einen Wert ein, verdoppelt ihn und gibt das Ergebnis aus – alles aus kleinen IO-Schritten in einer einzigen Beschreibung zusammengesetzt.
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 ()
}Sequenzieren mit einfachem Scala
Zum Vergleich sehen Sie hier eine sequenzielle Konsolenausgabe in einfachem Scala – sofort ausgewertet und nicht rein, im Gegensatz zur oben gezeigten verzögerten IO-Variante.
object Main {
def main(args: Array[String]): Unit = {
val n = 21
val d = n * 2
println(s"Doubled: $d")
}
}Kurztest
Welche Methode führt zwei unabhängige Effekte gleichzeitig aus und kombiniert ihre Ergebnisse?
Zusammenfassung
Sie haben IO-Programme kombiniert mit:
flatMapundforzum SequenzierenmapN/parMapNfür unabhängige Effekte*>,<*,voidzum Kombinieren und Verwerfentraverse/parTraversefür Sammlungen
Als Nächstes: Fehler innerhalb von IO behandeln.
Häufig gestellte Fragen
Ist die Lektion „IO kombinieren“ kostenlos?
Ja — der vollständige Text von „IO kombinieren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Scala for Backend Engineering & Functional Programming-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Scala for Backend Engineering & Functional Programming-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „IO kombinieren“?
Effekte sequenzieren Du übst Scala for Backend Engineering & Functional Programming mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Scala for Backend Engineering & Functional Programming zu starten?
Keine Vorkenntnisse erforderlich. Scala for Backend Engineering & Functional Programming auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „IO kombinieren“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Scala for Backend Engineering & Functional Programming-Lektion Code schreiben und ausführen?
Ja. Jede Scala for Backend Engineering & Functional Programming-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Cats-Typeclasses
- Die IO-Monade
- IO kombinieren
- Fehlerbehandlung in IO