“简单函数中的变量不在范围内”

时间:2017-11-03 11:17:45

标签: haskell

考虑下一段代码 -

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。这是什么原因?

1 个答案:

答案 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