Um zu verdeutlichen, was ich unter Ereignisgesteuert verstehe, beziehe ich mich auf eine Situation, in der ich
habe %Vor%Dies wird jedes Mal aufgerufen, wenn eine bestimmte Aktie handelt. Angenommen, ich möchte den höchsten täglichen Handelspreis verfolgen. Für mich ist die offensichtliche Lösung:
%Vor%Gibt es eine Möglichkeit, diese Funktionalität mit val statt var zu erreichen? Angenommen, ich möchte in Zukunft auch dailyLow, volumeHigh, volumeLow usw. hinzufügen.
Eigentlich kein großes Problem. Eine vollständige Lösung würde wahrscheinlich Reader, IO und State Monaden plus Iteratee und Linsen verwenden, aber hier ist eine einfachere Version:
%Vor%Schau, ma, nein vars!
Der Zustand kann natürlich sehr komplex werden, aber hier kommen Linsen ins Spiel. Mit Objektiven ist es sehr einfach, beliebig komplexe Datenstrukturen zu konsultieren und zu verändern (kopieren mit neuem Wert).
Die Verwendung von Iteraten ist natürlich für Ereignisse - in einem sehr einfachen Sinn wird "onTrade" zu einem iteratee, das von einem Enumerator (der Sache, die die Ereignisse "generiert") mit jedem Ereignis aufgerufen wird, wenn es aus einer Teilfunktion besteht falten Sie alle zu einer einzigen Teilfunktion.
Alternativ können State-Monaden mit IO-Monaden auf For-Comprehensions kombiniert werden.
Schließlich gibt es die Möglichkeit von Fortsetzungen. Wenn bei einer Verarbeitung eine Kette von Ereignissen empfangen werden muss, kann das Ergebnis jedes Ereignisses eine Fortsetzung sein, und die Fortführung selbst wird Teil des Zustands.
Das Papier Die Vernachlässigung des Beobachtermusters könnte von Interesse sein, aber ich glaube, die Bibliothek ist es Beschreibungen sind noch nicht verfügbar.
Ich empfehle die funktionale reaktive Programmierung für diese Aufgabe. Hier ist eine Diskussion über eine solche Bibliothek in Scala: Ссылка
Hat das nie gemacht, aber anstatt Werte zu ändern, könnten Sie neue Instanzen in einem Stream erstellen.
Ein anderer Prozess könnte dann diesen Stream iterieren, wodurch sie warten würden, wenn sie das letzte instanziierte Element eines Streams erreichen.
Tags und Links scala event-driven