Denken Sie daran, dass Schleifen wie diese in Haskell keine Magie sind ... sie sind nur normale erstklassige Dinge, die Sie selbst schreiben können.
Für was es wert ist, glaube ich nicht, dass es zu nützlich ist, an MaybeT
als ein Monad-Transformator zu denken. Für mich ist MaybeT
nur newtype Wrapper eine alternative Implementierung von (>>=)
zu geben ... wie, wie Sie verwenden Product
, Sum
, First
, And
usw. alternative Implementierungen von mappend
und mempty
zu geben.
Jetzt, (>>=)
für Sie ist IO a -> (a -> IO b) -> IO b
. Aber es wäre nützlicher, (>>=)
hier IO (Maybe a) -> (a -> IO (Maybe b) -> IO (Maybe b)
zu haben. Sobald Sie die erste Aktion erhalten, die eine Nothing
zurückgibt, ist es wirklich unmöglich, weiter zu "binden". Genau das gibt Ihnen MaybeT
. Sie erhalten auch eine "benutzerdefinierte Instanz" von guard
, guard :: Bool -> IO (Maybe a)
anstelle von guard :: IO a
.
forM_ [1..100] $ \i -> runMaybeT $ do
a <- lift doSomeIO
guard (isValid1 a)
b <- lift $ doSomeOtherIO a
guard (isValid2 b)
...
und das ist es
MaybeT
:) ist entweder keine Magie, und Sie können mithilfe von verschachtelten when
s im Grunde die gleiche Wirkung erzielen. Es ist nicht notwendig, macht es einfach viel einfacher und sauberer :)
ein paar Pakete auf Hackage bietet Schleifen verschiedener Art sind. Die interessanteste, die ich gesehen habe, ist wahrscheinlich https://hackage.haskell.org/package/loops – dfeuer
Monade Transformatoren sind nie notwendig - nur praktisch. –