Ich verstehe die genaue Algebra und Theorie hinter Haskells Monaden nicht. Wenn ich jedoch über die funktionale Programmierung im Allgemeinen nachdenke, habe ich den Eindruck, dass der Zustand modelliert wird, indem ein Anfangszustand genommen wird und eine Kopie davon erzeugt wird, um den nächsten Zustand darzustellen. Dies ist wie wenn eine Liste an eine andere angehängt wird; Keine der Listen wird geändert, aber eine dritte Liste wird erstellt und zurückgegeben.Können Haskells Monaden als versteckte Zustandsparameter verwendet und zurückgegeben werden?
Ist es daher zulässig, monadische Operationen als implizites Nehmen eines ursprünglichen Zustandsobjekts als Parameter und implizites Zurückgeben eines endgültigen Zustandsobjekts zu betrachten? Diese Zustandsobjekte würden verborgen sein, so dass sich der Programmierer nicht darum kümmern und kontrollieren muss, wie er darauf zugreift. Der Programmierer würde also nicht versuchen, das Objekt zu kopieren, das den IO-Stream darstellt, wie es vor zehn Minuten war.
Mit anderen Worten, wenn wir diesen Code haben:
main = do
putStrLn "Enter your name:"
name <- getLine
putStrLn ("Hello " ++ name)
... ist es OK der IO Monade zu denken und die „do“ Syntax wie diese Art von Code, der?
putStrLn :: IOState -> String -> IOState
getLine :: IOState -> (IOState, String)
main :: IOState -> IOState
-- main returns an IOState we can call "state3"
main state0 = putStrLn state2 ("Hello " ++ name)
where (state2, name) = getLine state1
state1 = putStrLn state0 "Enter your name:"
Ah ja, ich vergaß die Maybe und Entweder Monaden. – AJM
@AJM Es ist * eine gültige Möglichkeit, über IO zu denken. Du kannst dir vorstellen, dass IO eine staatliche Monade ist, mit der ganzen Realität als "s". – PyRulez