Ich habe einen Algorithmus, der auf einer IntMap operiert, von dem ich denke, dass er am besten ausgedrückt werden sollte. Das heißt, ich möchte Dinge sagen wie:
Das wäre ziemlich trivial, um es als zweizeilige Rekursion auszudrücken, aber der eigentliche Algorithmus ist etwas komplizierter, da er mehrere Nachschlage- und Löschoperationen beinhaltet. Daher möchte ich ihn in do
notation ausdrücken können.
Gibt es eine Standard "State" -ähnliche Monade, in der der Staat durch Data.Map
oder Data.IntMap
repräsentiert wird, wo ich etwas tun kann wie:
Ehrlich gesagt bin ich mir nicht sicher, wie ich das am besten ausdrücken soll. Aufgrund von lookup
scheint es von einer Art MaybeT IntMap m
Stack oder so etwas zu profitieren.
Ich habe ein bisschen gearbeitet, um meine eigene Statusmonade basierend auf Data.IntMap
zu definieren, bin sogar soweit gekommen, dass insert
und delete
arbeiten, aber ich bin ein bisschen hängengeblieben mit dem Umgang mit lookup
. Meistens habe ich das Gefühl, dass dies wahrscheinlich etwas ist, das schon jemand gelöst hat, aber ich kann es nicht auf Hackage finden.
Gibt es einen bestimmten Grund, warum Sie die Verwendung von Monad-Transformatoren vermeiden möchten? Wenn Sie das MaybeT-Paket von Hackage erhalten, können Sie Folgendes erreichen:
%Vor%Wenn lookupM fehlschlägt, schlägt der Rest der Berechnung fehl. Sie können diese Monaden jederzeit eingeben und entschlüsseln, so dass Sie diese unter einer reinen Funktionsschnittstelle verstecken können. Es ist nur die IO-Monade, von der Sie nicht außer in main ausgehen (und unsichere Funktionen verwenden).
Alles, was Sie sich merken müssen, ist eine Zustandsaktion, die zurückkehrt. Vielleicht tippen Sie einfach in den MaybeT-Konstruktor. Wenn Sie IO ausführen möchten, ändern Sie State to State.
Tags und Links haskell