Ich schaute auf den MonadState source code, ich verstehe nicht, warum diese 3 Funktionen nicht in den Leerlauf kommen? Wie wird das bewertet?bekommen und in MonadState setzen
class Monad m => MonadState s m | m -> s where
-- | Return the state from the internals of the monad.
get :: m s
get = state (\s -> (s, s))
-- | Replace the state inside the monad.
put :: s -> m()
put s = state (\_ -> ((), s))
-- | Embed a simple state action into the monad.
state :: (s -> (a, s)) -> m a
state f = do
s <- get
let ~(a, s') = f s
put s'
return a
Aus Interesse, was macht das '~' in der 'let' Anweisung? – rafalio
@radicality Es macht das Muster "unwiderlegbar". Aber es tut in diesem Fall nichts, da Muster in einer Let-Bindung sowieso unwiderlegbar sind. Eine unwiderlegbare Musterübereinstimmung teilt dem Compiler mit, dass Sie bezüglich des übereinstimmenden Konstruktors korrekt sind, so dass es die Destrukturierung verzögern kann, bis der Wert eines seiner Argumente tatsächlich erzwungen wird. Wenn Sie sich bei der Verwendung des Konstruktors geirrt haben, wird zu diesem Zeitpunkt eine Ausnahme ausgelöst, jedoch nicht früher. – Carl