Alle Funktionen im Enum-Modul sind eager. Wenn du mit dem Enum-Modul mehrere Operationen auf Enumerables ausführst, erzeugt jede Operation ein Zwischenergebnis.
Das Stream-Modul ist eine lazy Alternative zum eager Enum-Modul. Es bietet viele der gleichen Funktionen wie Enum, aber statt Zwischenergebnisse zu erzeugen, baut es eine Reihe von Berechnungen auf, die erst ausgeführt werden, wenn der Stream an eine Funktion aus dem Enum-Modul übergeben wird.
Streams implementieren das Enumerable-Protokoll und sind kombinierbar. Du kannst sie verketten, um komplexere Funktionalität zu erstellen.
Du bist ein großer Fan des Numberphile-YouTube-Kanals und hast gerade ein cooles Video über die Lucas-Folge gesehen. Du möchtest diese Folge mit Elixir erzeugen.
Beim Entwurf deiner Funktion möchtest du Lazy Evaluation nutzen, damit du so viele Zahlen erzeugen kannst, wie du willst, aber nur, wenn du sie wirklich brauchst. Also entscheidest du dich für einen Stream.
Füge eine Guard-Klausel hinzu, die einen Fehler auslöst, wenn die Folge mit etwas anderem als einer Ganzzahl oder mit einer Ganzzahl kleiner als 1 erzeugt wird. Wenn du das als ersten Schritt erledigst, vermeidest du Fehler durch unendliche Rekursion in späteren Schritten.
LucasNumbers.generate("Hello World")
# => ** (ArgumentError) count must be specified as an integer >= 1
Du weißt, dass die Folge zwei Startzahlen hat, die nicht derselben Regel folgen. Schreibe zwei Klauseln für die Basisfälle, die diese Zahlen zurückgeben:
LucasNumbers.generate(1)
# => [2]
LucasNumbers.generate(2)
# => [2, 1]
Bei jeder Folge, die länger als 2 ist, weißt du, dass du die beiden vorherigen Zahlen addieren musst, um die nächste Zahl zu erhalten, und so weiter. Schreibe den verallgemeinerten Fall.
LucasNumbers.generate(3)
# => [2, 1, 3]
LucasNumbers.generate(4)
# => [2, 1, 3, 4]
Melde dich bei Exercism an, um Elixir mit 58 Konzepte168 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.