Haskell `变量不在简单函数的作用域`中

Haskell `变量不在简单函数的作用域`中,haskell,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

考虑下一段代码-

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."
pvp::Board->Int->IO()
pvp棋盘玩家=do
玩家1选择“无效移动”
只要登上“->putStrLn”有效移动。“

对于
案例newboard of
,我得到
错误:变量不在范围内:newboard::可能是a0
。这是什么原因?

因为我没有完整的haskell文件,所以我只能给出一个有根据的猜测-但是你只有在
的范围内才有newboard,如果。。然后。。else
表达式

假设
put
返回一个新的
Board
,并且与
状态无关,则这应该是正确的:

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."
pvp::Board->Int->IO()
pvp棋盘玩家=do
玩家1选择做什么
putStrLn“无效移动。”
--游戏b
只要登上“->putStrLn”有效移动。“
注意(与您的问题无关)
你应该避免
read
如果有人输入一个无效的输入,它会使你的程序崩溃——比如说一个你期望数字的字母。更好地使用

因为我没有完整的haskell文件,所以我只能给出一个有根据的猜测-但是你只有在
的范围内使用newboard,如果。。然后。。else
表达式

假设
put
返回一个新的
Board
,并且与
状态无关,则这应该是正确的:

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."
pvp::Board->Int->IO()
pvp棋盘玩家=do
玩家1选择做什么
putStrLn“无效移动。”
--游戏b
只要登上“->putStrLn”有效移动。“
注意(与您的问题无关)
你应该避免
read
如果有人输入一个无效的输入,它会使你的程序崩溃——比如说一个你期望数字的字母。更好地使用

阅读此内容可能会有所帮助:阅读此内容可能会有所帮助:感谢您花时间回答我的问题,但通过此修复,我没有从文字“1”(第4行)中获得(Num String)的实例。我不知道第4行是什么,您需要显示整个文件,否则我帮不了您。不过,这是一个与当前问题无关的问题-最好为这个问题打开一个新的问题。我的意思是,正如我所说,我不能帮助你
董事会
,我也不知道
放置
提示
的定义。谢谢你花时间回答我的问题,但是在这个修复中,我没有从文本“1”中得到(Num String)的实例(第4行),我不知道第4行是什么,你需要显示整个文件,否则我帮不了你。不过,这是一个与当前问题无关的问题-最好为这个问题打开一个新的问题。我是说,正如我所说,我不能帮助你
我也不知道
放置
提示
的定义。