Was ist der "funktionale Weg", um das Übergeben von Statusauswahlkontexten im Call-Stack zu vermeiden?

8

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%     
Larry OBrien 16.03.2012, 02:18
quelle

4 Antworten

5

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).

    
Daniel C. Sobral 17.03.2012, 02:56
quelle
2

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.

Owen 17.03.2012 06:22
quelle
1

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.

    
huynhjl 16.03.2012 06:34
quelle
1

Die Reader-Monade könnte hilfreich sein. Siehe Tony Morris Blog

    
Landei 16.03.2012 08:08
quelle