Komposition af IO
Sekventering af effekter
Komposition af IO er en gratis Scala til backendudvikling og funktionel programmering-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Scala til backendudvikling og funktionel programmering, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Scala til backendudvikling og funktionel programmering-kurset indeholder 4 lektioner i alt.
Sekvensering med flatMap
Fordi IO er en monade, sammensætter du effekter med flatMap. Hvert trin køres i rækkefølge, og et senere trin kan bruge resultatet fra et tidligere trin.
import cats.effect.IO
val program: IO[Unit] =
IO("Alice").flatMap(name => IO.println(s"Hello, $name"))for-comprehension
En for-comprehension omskrives til flatMap/map og læses som et imperativt script, samtidig med at den forbliver ren.
import cats.effect.IO
val prog: IO[Unit] = for {
_ <- IO.println("What is your name?")
name <- IO("Bob")
_ <- IO.println(s"Hi $name")
} yield ()Rækkefølgen bevares
Effekter i en for-comprehension køres fra top til bund, når programmet udføres. Kodens struktur afspejler udførelsesrækkefølgen.
Kombinering af uafhængige effekter
Når to effekter ikke afhænger af hinanden, skal du bruge mapN eller (a, b).tupled til at kombinere dem. De køres stadig sekventielt som standard, men udtrykker uafhængighed.
import cats.effect.IO
import cats.syntax.apply._
val combined: IO[Int] = (IO(2), IO(3)).mapN(_ + _)Kørsel af effekter parallelt
Brug parMapN (fra cats.syntax.parallel) til at køre uafhængige effekter samtidigt på separate fibere og kombinere deres resultater.
import cats.effect.IO
import cats.syntax.parallel._
val par: IO[Int] = (IO(2), IO(3)).parMapN(_ + _)Kassering af resultater
Brug *> til at køre en effekt og beholde det andet resultat, eller <* for at beholde det første. void kasserer resultatet helt og giver IO[Unit].
import cats.effect.IO
val r1: IO[Int] = IO.println("log") *> IO(42)
val r2: IO[Unit] = IO(99).voidGentagelse af effekter
replicateA(n) kører en effekt n gange og samler resultaterne i en liste. foreverM gentager den uden ende.
import cats.effect.IO
val three: IO[List[Unit]] = IO.println("tick").replicateA(3)Gennemløb af en liste
Omdan en List[A] til en effekt over en List[B] med traverse. Hvert element producerer en IO, og resultaterne samles.
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 er den parallelle version af traverse — hvert elements effekt køres på sin egen fiber, hvilket er ideelt til samtidig I/O, f.eks. hentning af mange URL'er.
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))Et sammensat program
Dette program læser en værdi, fordobler den og udskriver resultatet — alt sammen sammensat af små IO-trin i én beskrivelse.
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 ()
}Sekvensering i almindelig Scala
Til sammenligning ser du her sekventielt konsoloutput i almindelig Scala — ivrigt og urent i modsætning til IO-versionen ovenfor, hvor det udskydes.
object Main {
def main(args: Array[String]): Unit = {
val n = 21
val d = n * 2
println(s"Doubled: $d")
}
}Hurtigt tjek
Hvilken metode kører to uafhængige effekter samtidigt og kombinerer deres resultater?
Opsummering
Du har sammensat IO-programmer med:
flatMapogfortil sekvenseringmapN/parMapNtil uafhængige effekter*>,<*,voidtil kombinering og kasseringtraverse/parTraversetil samlinger
Næste emne: håndtering af fejl i IO.
Lær Scala med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 39
- Lektioner
- 143
Ofte stillede spørgsmål
Er lektionen “Komposition af IO” gratis?
Ja — hele teksten til “Komposition af IO” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Scala til backendudvikling og funktionel programmering-kurset, skal du opgradere til CoddyKit PRO. Scala til backendudvikling og funktionel programmering-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Komposition af IO”?
Sekventering af effekter Du øver dig i Scala til backendudvikling og funktionel programmering med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Scala til backendudvikling og funktionel programmering?
Der kræves ingen tidligere erfaring. Scala til backendudvikling og funktionel programmering på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Komposition af IO”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Scala til backendudvikling og funktionel programmering-lektion?
Ja. Alle Scala til backendudvikling og funktionel programmering-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Cats-type classes
- IO-monaden
- Komposition af IO
- Fejlhåndtering i IO