Scala til backendudvikling og funktionel programmering · Lektion

Opbyg en LazyList

Konstruér lazy-sekvenser.

Lektion 2 af 413 trin

Opbyg en LazyList er en gratis Scala til backendudvikling og funktionel programmering-lektion på CoddyKit. Dette er lektion 2 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.

Grundlæggende konstruktion

Der er flere måder at bygge en LazyList på. Den enkleste er fabrikken apply, ligesom når du bygger en List.

Den egentlige styrke kommer dog fra konstruktører, der holder halen doven, og dem undersøger vi i denne lektion.

val ll = LazyList(10, 20, 30)
println(ll.head)

Den tomme LazyList

LazyList.empty er afslutningen, den dovne pendant til Nil. Alle endelige LazyLists slutter med den.

Du bruger den som basistilfælde, når du sætter elementer forrest med #::.

object Demo extends App {
  val empty = LazyList.empty[Int]
  println(empty.isEmpty)
  println(empty.toList)
}

Sæt forrest med #::

Operatoren #:: sætter et hoved foran en hale efter navn. Byg en liste fra højre mod venstre, og slut med LazyList.empty.

Fordi #:: tager halen dovent, bygges intet efter hovedet, før det tvinges.

object Demo extends App {
  val ll = 1 #:: 2 #:: 3 #:: LazyList.empty
  println(ll.toList)
}

Se den dovne evaluering

Placer en bivirkning i halen for at se, hvornår den køres. Det er kun, når du tvinger halen, at den udløses.

Kør dette: "building tail" udskrives først, når du tilgår det andet element, ikke når LazyList'en defineres.

object Demo extends App {
  val ll = 1 #:: { println("building tail"); 2 #:: LazyList.empty }
  println("defined")
  println(ll.head)
  println(ll(1))
}

cons eksplicit

Internt er #:: LazyList.cons. Både hovedet og halen er efter navn i cons, hvilket giver fuld kontrol over evalueringen.

Det er nyttigt, når du definerer rekursive generatorer.

val ll = LazyList.cons(1, LazyList.cons(2, LazyList.empty))
println(ll.head)

Rekursive generatorer

En LazyList kan referere til sig selv. Definer en funktion, der producerer et hoved og kalder sig selv rekursivt for halen.

Fordi halen er efter navn, løber rekursionen ikke for evigt; den holder pause, indtil der bliver bedt om hver celle.

def countFrom(n: Int): LazyList[Int] =
  n #:: countFrom(n + 1)

println(countFrom(5).take(3).toList)

Kør en generator

Lad os køre en generator, der refererer til sig selv, og hente nogle få værdier. take begrænser, hvor mange celler der tvinges.

Uden take ville dette køre i en uendelig løkke, så begræns altid en uendelig generator, før du tvinger den.

object Demo extends App {
  def countFrom(n: Int): LazyList[Int] =
    n #:: countFrom(n + 1)
  println(countFrom(1).take(5).toList)
}

Fra en iterator

Du kan indpakke en eksisterende samling eller iterator. LazyList.from(start) bygger en uendelig talrække, og someList.to(LazyList) konverterer data, der allerede er kendt, ivrigt.

Det giver en doven visning af data, du allerede har, eller som du kan beskrive.

object Demo extends App {
  val ll = List(1, 2, 3).to(LazyList)
  println(ll.map(_ * 2).toList)
}

LazyList.iterate

LazyList.iterate(seed)(f) anvender gentagne gange f for at bygge hvert næste element ud fra det foregående.

Det er en enkel måde at udtrykke sekvenser, der er defineret af en trinregel, f.eks. potenser af to.

object Demo extends App {
  val powers = LazyList.iterate(1)(_ * 2)
  println(powers.take(6).toList)
}

LazyList.continually

LazyList.continually(expr) gentager et udtryk uendeligt og evaluerer det igen for hvert element. Det er praktisk til konstante eller tilfældige datastrømme.

Kombiner den med take for at hente et endeligt udsnit.

object Demo extends App {
  val zeros = LazyList.continually(0)
  println(zeros.take(4).toList)
}

Vælg en konstruktør

Brug apply til faste, små lister, #:: eller cons til håndskrevet rekursion, iterate til trinregler, from til optælling og continually til gentagelse.

Alle holder halen doven, så valget handler om, hvad der udtrykker løsningen bedst.

Hurtig kontrol

Kontroller din forståelse af konstruktion af LazyList.

Opsamling

Du byggede LazyLists med apply, empty, #::/cons, iterate, from og continually.

Den dovne hale efter navn gør det sikkert at definere selvrefererende, potentielt uendelige generatorer. Derefter bruger vi dette til at skabe virkeligt uendelige datastrømme.

Gratis at komme i gang

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 “Opbyg en LazyList” gratis?

Ja — hele teksten til “Opbyg en LazyList” 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 “Opbyg en LazyList”?

Konstruér lazy-sekvenser. 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 2 af 4.

Hvor lang tid tager lektionen “Opbyg en LazyList”?

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

  1. Laziness forklaret
  2. Opbyg en LazyList
  3. Uendelige streams
  4. Lazy udtagning og filtrering
← Tilbage til Scala til backendudvikling og funktionel programmering