Wie man veränderbaren Vektor in Zustands-Monade setzt

8

Ich habe ein kleines Programm in haskell geschrieben, um alle Vorkommen von Int-Werten in Tree mit State Monad mit Vector zu zählen:

%Vor%

Aber 'update' von unveränderlichen Vektoren erfolgt in O (n) -Komplexität. Und ich suche nach Update in O (1) und Zugriff in O (1). Wie ich es verstehe, machen Mutable Vectors was ich will. Um sie zu benutzen, muss ich ST oder IO benutzen. Da ich einige UnitTests machen möchte, bevorzuge ich ST monad, aber ich möchte diesen Vektor nicht in Funktionsaufrufen übergeben müssen. Ich muss weiterhin Monad Transformers verwenden, weil ich Transformatoren wie ErrorT und WriterT hinzufügen werde.

Frage: Wie setzt man den Veränderlichen Vektor mit Monad-Transformatoren in State-Monade?

Ich habe folgenden Code entwickelt, der nicht kompiliert:

%Vor%

Kompilierfehler sind:

%Vor%

Hinweis: Ich bin mir bewusst, dass ich keine Grenzen überprüfe.

    
user2746253 10.05.2014, 10:34
quelle

1 Antwort

13

Wenn Sie ST state verwenden, geben Sie nie explizit den Vektor herum (der immer im Argument s verborgen ist), sondern einen Verweis darauf. Diese Referenz ist unveränderlich und wird nicht kopiert, Sie brauchen also nicht State , sondern einfach ein Lesegerät, um es implizit zu übergeben.

%Vor%     
leftaroundabout 10.05.2014, 11:22
quelle