haskell - How do I use `break_` in the package "loops"? -
looking package loops, found interesting , useful. however, there's 1 part package don't understand: how supposed use break_?
let's have function get' :: io (maybe int), each call return number read file, , returns nothing if eof reached. i'm trying construct simple loop print each number , break upon eof.
now, know loop indefinitely can use forever:
import control.monad.loop ml import control.monad m main = m.sequence . loop $ ml.forever return $ mx <- get' case mx of nothing -> ??? x -> print x but put break_? loopt io int, can put in loopt monad, isn't supposed called mid interation, instead of when defining loops? confuses me.
loopt monad transfomer, need liftio print x statement.
here usage examples:
import control.monad import control.monad.trans (liftio) import control.monad.loop ml -- infinite printing loop foo :: loopt io () foo = x <- ml.iterate 0 (+1) liftio $ print x run_foo = ml.exec_ foo -- prints 1, 3, 5, 7, 9 bar :: io () bar = ml.exec_ $ x <- ml.iterate 1 (+2) if x < 10 liftio $ print x else break_ update
if want execute infinite loop in monad, use forever control.monad --
import control.monad import control.monad.state myloop = forever $ x <- liftio $ print x put (x+1) main = runstatet myloop 10 -- start loop @ 10 update 2
another example using monadic condition:
findfavoritenumber = ml.exec_ $ x <- ml.iterate 1 (+1) yn <- liftio $ putstr $ "is " ++ show x ++ " favorite number? " getline if yn == "yes" break_ else return () of course, loop doesn't return favorite number - keeps asking until user responds "yes".
Comments
Post a Comment