我是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
可以调用loop
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)
Run Code Online (Sandbox Code Playgroud)
而循环只是做一个简单的愚蠢的工作,要求二进制输入(增加计数器与否),以及循环.
如果这没有帮助那么也许您可以发布更完整的问题和代码.我将使用更新的答案进行编辑.
或者你可以使用forever
.
main = do
x <- getLine
foo
forever $ do
y <- getLine
baz
Run Code Online (Sandbox Code Playgroud)
如果你是Haskell的新手,我建议你通过LYAH进行一次很好的介绍.