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?
Monaden würden funktionieren, aber meiner Meinung nach ist Applicative
hier sauberer:
Dies verwendet die ((->) r)
-Instanz, wie die Reader
monad / applicative, aber ohne den Wrapper des neuen Typs.
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:
Fügen Sie einfach Ihren Umgebungstyp als erstes Argument in den Konstruktor Reader
und Ihren ursprünglichen Ergebnistyp als zweites Argument ein.
Anstelle von c
als Wert für den Fall Const
verwenden Sie return
, um es in die Monade zu heben:
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:
Ich denke jedoch, dass es schöner ist, fmap
a.k.a. <$>
:
Ebenso kann das unäre not
über das Ergebnis der Rekursion fmap
ped sein:
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%Kennen Sie die Erweiterung implizite Parameter ? Es könnte sehr hilfreich sein.