Existiert eine Monad-Instanz für Data.Map / Data.IntMap?

7

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:

  • Suchen Sie in der Karte nach Wert X.
  • Wenn es einem Kriterium entspricht, entfernen Sie diesen Wert aus der Karte.
  • Schleife, bis keine weiteren Werte in der Karte vorhanden sind.

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:

%Vor%

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.

    
Steve 11.02.2011, 19:48
quelle

1 Antwort

21

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.

    
snk_kid 11.02.2011, 20:52
quelle

Tags und Links