Haskell中“循环”IO的问题

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

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

该计划的结构如下:

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

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

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

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

Ideally, I would have a function called from main that calls itself
until one player loses. But, this does not seem to work, since using
any variables set in that function by user input results in type
errors.

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

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 :: 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)

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

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

翻译自:https://stackoverflow.com/questions/6785751/problem-with-looping-io-in-haskell

转载注明原文:Haskell中“循环”IO的问题