Ich versuche, den folgenden Stateful Imperativ-Code in Haskell zu konvertieren.Stateful Schleife mit verschiedenen Arten von Brüchen
while (true) {
while (get()) {
if (put1()) {
failImmediately();
}
}
if (put2()) {
succeedImmediately();
}
}
Sowohl die put1
und put2
lesen einen Zustand des Systems und ändern. get
kann der Einfachheit halber nur den Zustand ablesen. failImmediately
sollte aus der Endlosschleife ausbrechen und eine Art Ergebnis anzeigen, succeedImmediately
sollte ebenfalls ausbrechen aber ein anderes Ergebnis ergeben.
Was ich versucht war zu verwenden State Env Result
wo Env
den Zustand der Umwelt dargestellt und Result
war so etwas wie Either Failure Success
für einige benutzerdefinierte Failure
und Success
.
Ich kämpfe mit der Anforderung, dass der gesamte resultierende Ausdruck in die Failure
/Success
einstürzen sollte, sobald einer von ihnen produziert wird (die Schleife zu brechen) und ansonsten weitermachen.
Eine Idee war ich Either Exit()
wo data Exit = Success | Failure
verwenden hatte und verwenden StateT
irgendwie auf Left
der Either
als ob Either
wurde die Monade ist gekettet, das heißt ignoriert alle nachfolgenden Aktionen zu verhalten.
Ich würde wirklich jede Inspiration oder ein Beispiel von Haskell-Code schätzen, der das gleiche Verhalten wie das obige Snippet erreichen würde.
Bearbeiten: verfeinerte Version verschoben, um eine separate Frage "Stateful computation with different types of short-circuit (Maybe, Either)".
Sie sollten schauen Sie in [ 'EitherT (State Env Ergebnis)'] (https://hackage.haskell.org/package/either-4.4.1/docs/Kontrolle-M onad-Trans-Entweder.html). Lassen Sie mich wissen, wenn dieser Hinweis nicht genug ist und Sie weitere Details benötigen :) – Cactus
Ich habe das Gefühl, dass dies das sein könnte, was ich brauche, außer dass ich nicht die geringste Ahnung habe, wie ich es in diesem Szenario verwenden soll :(so nett zu erarbeiten Ich wäre dir so dankbar – jakubdaniel