haskell - How do I "continue" in a `Monad` loop? -


often times found myself in need of skipping rest of iteration (like continue in c) in haskell:

form_ [1..100] $ \ ->     <- dosomeio     when (not $ isvalid1 a) <skip_rest_of_the_iteration>     b <- dosomeotherio     when (not $ isvalid2 b) <skip_rest_of_the_iteration>     ... 

however, failed find easy way so. way aware of trans.maybe, necessary use monad transform achieve trivial?

remember loops in haskell not magic...they're normal first-class things can write yourself.

for it's worth, don't think it's useful think of maybet monad transformer. me, maybet newtype wrapper give alternative implementation of (>>=)...just how use product, sum, first, and, etc. give alternative implementations of mappend , mempty.

right now, (>>=) io -> (a -> io b) -> io b. it'd more useful have (>>=) here io (maybe a) -> (a -> io (maybe b) -> io (maybe b). first action returns nothing, it's impossible "bind" further. that's maybet gives you. "custom instance" of guard, guard :: bool -> io (maybe a), instead of guard :: io a.

form_ [1..100] $ \i -> runmaybet $   <- lift dosomeio   guard (isvalid1 a)   b <- lift $ dosomeotherio   guard (isvalid2 b)   ... 

and that's :)

maybet not magic either, , can achieve same effect using nested whens. it's not necessary, makes things lot simpler , cleaner :)


Comments