Ich habe Probleme mit Elms Mangel an Monaden. Eine Bibliothek, die die staatliche Monade für Elm implementiert (http://package.elm-lang.org/packages/folkertdev/elm-state/latest/State), hat mir ziemlich geholfen.Wie kombiniere ich Ergebnis und Status in Elm?
Das Problem ist, dass ich jetzt in eine Situation geraten bin, wo ich abwechselnd geschachtelt habe Ergebnis-und State-Typen, wenn ich nur eine von jedem haben will.
Ich habe versucht, eine Funktion mit der folgenden Signatur zu schreiben, aber es scheint unmöglich, weil das innere Ergebnis nur bekannt ist, sobald der äußere Zustand ausgewertet wird.
join : Result a (State s (Result a (State s x))) -> Result a (State s x)
Vielleicht, es würde funktionieren, wenn ich das Ergebnis innerhalb des Staates, in dem Rückgabewert gesetzt, aber das wäre einen Dummy-Staat im Fall des Außen Ergebnis Err
ist zu erzeugen.
Ich denke, die richtige Idee wäre, etwas zu machen, das sowohl Ergebnis als auch Zustand ist. Kann jemand, der mit Haskell-Monade-Transformatoren vertraut ist, erklären, wie sie diese Art von Problem lösen oder eine alternative Lösung vorschlagen?
ist hier eine grobe Version von einem Ort, wo das Problem entsteht:
generateConstraints environment value
|> Result.map (State.map (\(value, valueC) ->
Result.map
(State.map2 (\this (body, bodyC) ->
(this
, valueC++ bodyC++ [(this, body)]
))
freshTypevar)
(generateConstraints (extend environment name value) body))
)
Monade-Transformatoren sind eine Art von Schmerzen, wenn Sie die gleiche Art von Transformator mischen. Ich verwende normalerweise monad typeclasses, aber diese scheitern, wenn der Typ mehrmals erscheint. Eine Lösung dafür ist, die bestimmten Kontexte neu zu tippen, die Sie benötigen. –
Ich brauche nicht wirklich die gleiche Monade mehrmals. Das Code-Snippet, das ich eingefügt habe, ist ein Fall von 'generateConstraints', der 'Result String (State Int (Typ, Listenbeschränkung))' zurückgibt. Rekursion funktioniert gut, aber die Constraint-Generierung für Let Bindings, die die Monaden durcheinander bringen, ist anders. – Joonazan
Ich weiß immer noch nicht, wie ich den Zustand kombinieren und möglicherweise falsch sein kann, aber das besondere Beispiel, das ich mir gegeben habe, löste sich auf wundersame Weise, weil ich in der Lage war, alle außergewöhnlichen Ergebnisse daraus zu entfernen. – Joonazan