Raku-Kurs / Funktionale, nebenläufige, reaktive und Web-Programmierung / Funktionale Programmierung / Lazy und unendliche Sequenzen

Unendliche Sequenzen

Ersetzen Sie den Endwert durch ein *, und die Sequenz wird unendlich — sie hat kein letztes Element. Da die Liste träge ist, ist das völlig ungefährlich: Es wird nichts berechnet, bis Sie es entnehmen.

say (1, 2, 4 ... *).head(5); # (1 2 4 8 16)

Die Folge der Zweierpotenzen läuft ewig weiter, aber .head(5) entnimmt nur die ersten fünf. Der Bereich 1..* ist die einfachste unendliche Sequenz — alle ganzen Zahlen ab eins:

say (1..*).head(3);          # (1 2 3)
say (1..*).map(* ** 2).head(4); # (1 4 9 16)

Sie können eine Sequenz sogar mithilfe ihrer eigenen früheren Elemente festlegen. Die Fibonacci-Folge, in der jede Zahl die Summe der beiden vorigen ist, ist bekanntlich ein Einzeiler:

my @fib = 1, 1, * + * ... *;
say @fib[^10]; # (1 1 2 3 5 8 13 21 34 55)

Die Closure * + * nimmt die beiden vorigen Elemente und addiert sie. Die Sequenz in @fib abzulegen ist hier unbedenklich, denn der Operator ... kennzeichnet sie als träge, das Array versucht also nicht, sie ganz zu berechnen — nur die zehn von @fib[^10] angeforderten Elemente entstehen überhaupt.

Die Faustregel: Eine unendliche Sequenz ist sicher, solange Sie ihr nur ein endliches Stück entnehmen.

Praxis

Lösen Sie 1 Quiz zum Inhalt dieses Themas.

Kursnavigation

Quiz — Der Sequenzoperator   |   Quiz — Lazy Sequenzen


💪 Oder springen Sie direkt zu den Übungen dieses Abschnitts.