Sagen Sie, ich habe eine Eigenschaft, die zwei Listen hat. Manchmal bin ich an dem einen interessiert, manchmal an dem anderen.
%Vor%Ich habe eine Kette von Funktionsaufrufen, an deren Spitze ich den Kontext habe, den ich zwischen den Listen wählen muss, aber an dessen Ende ich das Merkmal verwende.
Im imperativen Paradigma gebe ich den Kontext durch die Funktionen weiter:
%Vor%Im objektorientierten Paradigma kann ich den internen Zustand verwenden, um den Kontext nicht zu überschreiten:
%Vor%Was ist der idiomatische Weg, um in einer funktionalen Sprache ein ähnliches Ergebnis zu erzielen?
Das heißt, ich möchte, dass die Ausgabe des Folgenden der Ausgabe von oben ähnlich ist.
%Vor%UPDATE: Würde dies als richtig funktional betrachtet?
%Vor%Nun, man kann immer Monaden und monadische Übersichten verwenden, um mit solchen Dingen fertig zu werden, aber das Herz der Sache ist, dass man, anstatt Optionen auf dem Stapel zu verteilen, Funktionen bis zum Stapel zurückgibt, bis jemand, der weiß wie das Problem zu lösen, kann damit umgehen.
%Vor%Und dann
%Vor%Sobald Sie beginnen, Muster für diese Art von Dingen zu entwickeln, enden Sie mit Monaden aller Art (jede Art von Monade repräsentiert ein bestimmtes Muster).
Ich denke, deine Antwort unter "UPDATE" ist vollkommen gut. Ja, Sie können die Reader-Monade hier verwenden. Aber warum, wenn Sie eine perfekte Lösung haben, die keine Monaden verwendet?
Daniels monadische Lösung ist schön und elegant, aber Sie werden feststellen, dass, wenn die Methoden fTop
und fMiddle
komplizierter werden, viel zusätzliche Syntax benötigt wird, um den fehlenden Parameter zu durchlaufen / p>
Ich denke, die Verwendung eines class
zum Speichern des Kontexts ist angemessen, weil:
Das sind Klassen für: Einen Kontext zwischen Funktionen zu teilen.
Scala hat eine viel schönere Syntax für Klassen als für Monaden.
Ihre erste imperative Version sieht für mich am funktionalsten aus.
In der Regel werden die Reader-Monade und der State-Monad-Transformer verwendet, um den Kontext oder den Zustand des Aufruf-Stacks weiterzugeben.
Siehe Scalaz state monad examples zum Beispiel von state monad und seht dieses scalaz mailing Thread für eine ähnliche Frage und eine Antwort auflisten.
Tags und Links scala design-patterns functional-programming idioms