In Scala, wie würde ich ereignisgesteuerte Programmierung mit einem funktionalen Ansatz kombinieren?

8

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.

    
deltanovember 25.07.2011, 09:44
quelle

5 Antworten

7

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.

    
Daniel C. Sobral 25.07.2011, 21:38
quelle
9

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.

    
Didier Dupont 25.07.2011 11:14
quelle
2

Manchmal ist ein veränderbarer Status erforderlich. Im Folgenden finden Sie ein Beispiel aus dem Buch 'scala by example'. Es hat auch einen veränderbaren Status (maxBid, maxBidder) . So ist eine var nicht immer eine schlechte Idee. Manchmal funktioniert es gut.

%Vor%     
jilen 25.07.2011 11:02
quelle
0

Ich empfehle die funktionale reaktive Programmierung für diese Aufgabe. Hier ist eine Diskussion über eine solche Bibliothek in Scala: Ссылка

    
AndreasScheinert 25.07.2011 11:24
quelle
0

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.

    
Jens Schauder 25.07.2011 09:59
quelle

Tags und Links