Vermeiden Sie die explizite Weitergabe der Nachschlagetabelle

7

In meinem sehr einfachen booleschen Ausdrucksprogramm habe ich folgende Bewertungsfunktion:

%Vor%

Ich habe mich gefragt, ob es eine Möglichkeit gibt, die Tabelle values implizit zu übergeben? Vielleicht mit Hilfe von Monaden?

    
fredoverflow 21.09.2011, 17:28
quelle

4 Antworten

4

Übergeben Sie in diesem Fall values überhaupt nicht:

%Vor%     
nimi 21.09.2011, 19:51
quelle
13

Monaden würden funktionieren, aber meiner Meinung nach ist Applicative hier sauberer:

%Vor%

Dies verwendet die ((->) r) -Instanz, wie die Reader monad / applicative, aber ohne den Wrapper des neuen Typs.

    
Sjoerd Visscher 21.09.2011 17:53
quelle
9

Genau das ist die Reader-Monade ist für:

  

Die Reader-Monade (auch Umgebungs-Monade genannt). Repräsentiert a   Berechnung, die Werte aus einer gemeinsamen Umgebung lesen kann, übergeben   Werte von Funktion zu Funktion und führen Teilberechnungen in a aus   modifizierte Umgebung.

Wie Sjoerd bemerkt, gibt die Monade hier mehr Leistung, als Sie benötigen, aber Sie können immer noch die Reader-Monade für dieses Problem verwenden, ohne dass Sie do eingeben müssen:

%Vor%

Fügen Sie einfach Ihren Umgebungstyp als erstes Argument in den Konstruktor Reader und Ihren ursprünglichen Ergebnistyp als zweites Argument ein.

%Vor%

Anstelle von c als Wert für den Fall Const verwenden Sie return , um es in die Monade zu heben:

%Vor%

Wenn Sie die Umgebung benötigen, um nach dem Wert einer Variablen zu suchen, verwenden Sie ask . Mit der do -Notation können Sie den Fall Var wie folgt schreiben:

%Vor%

Ich denke jedoch, dass es schöner ist, fmap a.k.a. <$> :

zu verwenden %Vor%

Ebenso kann das unäre not über das Ergebnis der Rekursion fmap ped sein:

%Vor%

Zum Schluss die Applicative -Instanz Der Leser macht die binären Fälle angenehm:

%Vor%

Dann, um alles zu starten, ist hier ein Helfer, um die anfängliche Umgebung zu erstellen und die Berechnung auszuführen:

%Vor%     
acfoltzer 21.09.2011 17:57
quelle
2

Kennen Sie die Erweiterung implizite Parameter ? Es könnte sehr hilfreich sein.

    
fuz 21.09.2011 18:39
quelle