Haskell中“循环”IO的问题

时间:2011-07-22 04:46:06

标签: haskell

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

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

该计划的结构如下:

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

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

*“循环”:在每个玩家之间交替,提示命令直到一个玩家输掉。

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

2 个答案:

答案 0 :(得分:22)

  

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

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

import System.IO

处理缓冲问题。

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

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

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)

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

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

答案 1 :(得分:6)

或者您可以使用forever

main = do
  x <- getLine
  foo
  forever $ do
     y <- getLine
     baz

如果您是Haskell的新手,我建议您通过LYAH进行介绍。