考虑下一段代码 -
pvp::Board->Int-> IO ()
pvp board player = do
player1choice <- prompt $ ("Player " ++ (show (player + 1)) ++ ", it's your turn:")
if player == 0
then let newboard = (put board X (read player1choice)) in newboard
else let newboard = (put board O (read player1choice)) in newboard
case newboard of
Nothing -> putStrLn "Invalid move."
Just board' -> putStrLn "Valid move."
对于case newboard of
,我得到error: Variable not in scope: newboard :: Maybe a0
。这是什么原因?
答案 0 :(得分:4)
由于我没有整个haskell文件,我只能给出一个有根据的猜测 - 但是你只在你的if .. then .. else
表达式
这应该是正确的,假设put
正在返回新的Board
- 并且与State
无关:
pvp :: Board -> Int -> IO ()
pvp board player = do
player1choice <- prompt $ ("Player " ++ (show (player + 1)) ++ ", it's your turn:")
let newboard = if player == 0
then put board X (read player1choice)
else put board O (read player1choice)
case newboard of
Nothing -> do
putStrLn "Invalid move."
-- playGame b
Just board' -> putStrLn "Valid move."
你应该避免read
如果有人输入了无效的输入,它会使你的程序崩溃 - 比如你想要一些数字的字母。更好地使用readMaybe