Haskell中"循环"IO的问题

dae*_*lic 7 haskell

我是Haskell的新手,所以我试图制作一个简单的双人游戏文本游戏,以帮助我学习它.

但是,我遇到了在"循环"中执行IO的问题.据我所知,除非在main中设置,否则不能使用从用户输入设置的变量.这是一个问题,因为对main的递归调用对我来说是无用的,因为main不接受任何参数.理想情况下,我会有一个从main调用的函数调用自己直到一个玩家失败.但是,这似乎不起作用,因为通过用户输入使用该函数中设置的任何变量会导致类型错误.

该计划的结构如下:

*提示玩家1获取名称并设置player1变量.

*提示玩家2获取名称并设置player2变量.

*"循环":在每个玩家之间交替,提示命令直到一个玩家输了.

解决这个问题的最佳方法是什么?

Tho*_*son 22

理想情况下,我会有一个从main调用的函数调用自己直到一个玩家失败.但是,这似乎不起作用,因为通过用户输入使用该函数中设置的任何变量会导致类型错误.

这是完全可能的.下次请包含一些代码,以便我们帮助您解决误解.这是一个示例代码段:

import System.IO
Run Code Online (Sandbox Code Playgroud)

处理缓冲问题.

main = do
    hSetBuffering stdin NoBuffering
    putStrLn "Gimma a name ye skervy dog!"
    name1 <- getLine
    putStrLn "Good, Good, now another, and make it snappy!"
    name2 <- getLine
    loop name1 name2 10
Run Code Online (Sandbox Code Playgroud)

注意main可以调用loopIO monad中的另一个函数().这个其他功能完全能够获取和操作用户输入,调用自身和/或获取参数.

loop :: String -> String -> Int -> IO ()
loop _ _ 0 = return ()
loop n1 n2 i = do
    putStrLn $ "Ok Mr. " ++ n1 ++ " and Mrs. " ++ n2 ++
               " tis time to roll the dice!"
    print i
    putStrLn "Options: (k)eep looping, (i)ncrement loop counter by 10"
    c <- getChar
    putStr "\n"
    case c of
        'k' -> loop n1 n2 (i-1)
        _   -> putStrLn "Blood and bloody ashes, we have to keep going?" >>
               loop n1 n2 (i+10)
Run Code Online (Sandbox Code Playgroud)

而循环只是做一个简单的愚蠢的工作,要求二进制输入(增加计数器与否),以及循环.

如果这没有帮助那么也许您可以发布更完整的问题和代码.我将使用更新的答案进行编辑.


san*_*oyd 6

或者你可以使用forever.

main = do
  x <- getLine
  foo
  forever $ do
     y <- getLine
     baz
Run Code Online (Sandbox Code Playgroud)

如果你是Haskell的新手,我建议你通过LYAH进行一次很好的介绍.