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