如何在程序包“loops”中使用`break_`? [英] How do I use `break_` in the package "loops"?

查看:145
本文介绍了如何在程序包“loops”中使用`break_`?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

查看软件包 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆