如何在程序包“loops”中使用`break_`? [英] How do I use `break_` in the package "loops"?
问题描述
查看软件包 loops
,我发现它很有趣,可能会有用。但是,有一部分关于我不明白的包:我该如何使用 break _
?
我有一个函数 get':: IO(Maybe Int)
,每次调用都会返回一个从文件中读取的数字,并返回 Nothing
如果EOF已达到。我试图构造一个简单的循环,在这里我打印每个数字并在EOF中断开。
现在,我知道无限循环,我可以使用永远
:
导入Control.Monad.Loop作为ML
导入Control.Monad as M
main = do
M.sequence。 loop $ do
ML.forever
return $ do
mx< - get'
case mx of
Nothing - > ???
只需x - >打印x
但是我在哪里放置 break _
?它是一个 LoopT IO Int
,所以我只能将它放在 LoopT
monad中,但它不是它应该被称为中间interation,而不是定义循环时?这真令我困惑。
LoopT
是一个monad transfomer,所以您需要 liftIO
您的 print x
语句。
以下是一些用法示例:
import Control.Monad
import Control.Monad.Trans(liftIO)
导入Control.Monad.Loop作为ML
- 无限打印循环
foo :: LoopT IO()
foo = do
x< - ML。迭代0(+1)
liftIO $ print x
run_foo = ML.exec_ foo
- 打印1,3,5,7,9
bar :: IO()
bar = ML.exec_ $ do
x< - ML.iterate 1(+2)
if x< 10
然后liftIO $ print x
else break_
更新
如果你想在另一个monad中执行一个无限循环,我只需要使用永远 code> Control.Monad
-
import Control.Monad
import Control.Monad.State
myloop = forever $ do
x< - get
liftIO $ print x
put(x + 1)
main = runStateT myloop 10 - 启动循环为10
更新2
另一个使用monadic条件的例子:
findFavoriteNumber = ML .exec_ $ do
x< - ML.iterate 1(+1)
yn< - liftIO $ do putStr $is++ show x ++your favorite number?
getLine
if yn ==yes
then break_
else return()
当然,这个循环不会返回最喜欢的数字 - 它只是保持不变直到用户回答是。
Looking into the package loops
, I found it very interesting and could be useful. However, there's one part about the package that I don't understand: how am I supposed to use break_
?
Let's say I have a function get' :: IO (Maybe Int)
, with which each call will return a number read from a file, and returns Nothing
if the EOF is reached. I'm trying to construct a simple loop where I print each number and break upon EOF.
Now, I know to loop indefinitely I can use forever
:
import Control.Monad.Loop as ML
import Control.Monad as M
main = do
M.sequence . loop $ do
ML.forever
return $ do
mx <- get'
case mx of
Nothing -> ???
Just x -> print x
But where do I put my break_
? It is a LoopT IO Int
, so I can only put it in LoopT
monad, but isn't it supposed to be called mid interation, instead of when defining loops? This really confuses me.
LoopT
is a monad transfomer, so you will need to liftIO
your print x
statement.
Here are some usage examples:
import Control.Monad
import Control.Monad.Trans (liftIO)
import Control.Monad.Loop as ML
-- infinite printing loop
foo :: LoopT IO ()
foo = do
x <- ML.iterate 0 (+1)
liftIO $ print x
run_foo = ML.exec_ foo
-- prints 1, 3, 5, 7, 9
bar :: IO ()
bar = ML.exec_ $ do
x <- ML.iterate 1 (+2)
if x < 10
then liftIO $ print x
else break_
Update
If you want to execute a infinite loop in another monad, I would just use forever
from Control.Monad
--
import Control.Monad
import Control.Monad.State
myloop = forever $ do
x <- get
liftIO $ print x
put (x+1)
main = runStateT myloop 10 -- start loop at 10
Update 2
Another example using a monadic condition:
findFavoriteNumber = ML.exec_ $ do
x <- ML.iterate 1 (+1)
yn <- liftIO $ do putStr $ "is " ++ show x ++ " your favorite number? "
getLine
if yn == "yes"
then break_
else return ()
Of course, this loop doesn't return the favorite number - it just keeps asking until the user responds with "yes".
这篇关于如何在程序包“loops”中使用`break_`?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!