Implementiere grundlegende Operationen der Stream-Ability.
In funktionalen Sprachen sind Funktionen wie filter, map und reduce sehr verbreitet. Implementiere eine Reihe grundlegender funktionaler Kombinatoren für eine Stream-Ability, ohne vorhandene Funktionen zu verwenden. Dafür musst du eigene Ability-Handler schreiben.
💡 Wir nennen diese Ability MyStream, um Konflikte mit der vorhandenen Stream-Ability in der Standardbibliothek zu vermeiden.
Die Operationen, die du implementieren musst, sind:
MyStream.fromList (aus einer Liste von Elementen einen Stream von Elementen erzeugen )MyStream.toList (einen Stream von Elementen zu einer Liste materialisieren)MyStream.toListWithResult (einen Stream von Elementen zu einer Liste materialisieren, zusammen mit dem Ergebnis der Stream-Funktion)MyStream.ignore (bei einem Stream von Elementen die ausgegebenen Werte ignorieren und die Ergebnisse der Stream-Funktion zurückgeben)MyStream.filter (aus einem Prädikat und einem MyStream den MyStream aller Elemente zurückgeben, für die predicate(item) wahr ist);MyStream.map (aus einer Funktion und einem MyStream den MyStream der Ergebnisse zurückgeben, die sich beim Anwenden von function(item) auf alle Elemente ergeben);MyStream.flatMap (aus einer Funktion, die einen MyStream erzeugt, und einem MyStream den MyStream der Ergebnisse zurückgeben, die sich beim Anwenden von function(item) auf alle Elemente ergeben)Ein Stream ist eine Unison-Ability, mit der du Werte ausgeben kannst.
Du könntest die Stream-Ability verwenden, wenn du eine Funktion hast, die beim Aufruf nebenbei Werte erzeugen soll. Diese Funktion gibt zum Beispiel den letzten Wert der Liste zurück, gibt aber eine laufende Summe aus, sobald sie ein Element sieht:
emitRunningTotal : '{Stream Nat} Nat
emitRunningTotal = 'let
use Nat +
List.foldLeft (
acc a -> let
runningTotal = acc + a
Stream.emit runningTotal
a
) 0 [1,2,3,4,5]
Mit einem Ability-Handler kannst du den Stream zusammen mit dem Rückgabewert der Funktion, die ihn erzeugt, als Liste materialisieren:
> Stream.toListWithResult! emitRunningTotal
⧩
([1, 3, 5, 7, 9], 5)
Melde dich bei Exercism an, um Unison mit 53 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.