Parsing Haskell中的语法分析

Parsing Haskell中的语法分析,parsing,haskell,Parsing,Haskell,无论我尝试什么,我总是会遇到解析错误,这是非常令人沮丧的。你知道我能做些什么来解决这个问题吗? (这是tic tac toe程序的功能) play':网格->播放器->IO() 玩g p |wins O g=putStrLn“玩家O赢!\n” |wins X g=putStrLn“玩家X赢!\n” |完全g=putStrLn“这是平局!\n” |p==O=DoI do putStrLn“错误:无效移动” 玩g p [g']->播放g'(下一个p) |p==X=do putStr“玩家X正在思考…

无论我尝试什么,我总是会遇到解析错误,这是非常令人沮丧的。你知道我能做些什么来解决这个问题吗? (这是tic tac toe程序的功能)

play':网格->播放器->IO()
玩g p
|wins O g=putStrLn“玩家O赢!\n”
|wins X g=putStrLn“玩家X赢!\n”
|完全g=putStrLn“这是平局!\n”
|p==O=DoI do putStrLn“错误:无效移动”
玩g p
[g']->播放g'(下一个p)
|p==X=do putStr“玩家X正在思考…”
设gs=gp

n你的压痕似乎有问题。在“do”块中,每个操作都需要从同一列开始,如下所示:

example :: IO ()
example = do putStr "How old are you?"
             age <- getLine
             let reply = "You are: " ++ age
             putStr reply
示例::IO() 示例=输入“你多大了?” 年龄游戏g'(下一个p) |p==X=do putStr“玩家X正在思考…” 设gs=gp
n你的压痕似乎有问题。在“do”块中,每个操作都需要从同一列开始,如下所示:

example :: IO ()
example = do putStr "How old are you?"
             age <- getLine
             let reply = "You are: " ++ age
             putStr reply
示例::IO() 示例=输入“你多大了?” 年龄游戏g'(下一个p) |p==X=do putStr“玩家X正在思考…” 设gs=gp
n您遇到了什么解析错误?您必须对齐第一个
do
块中的
i
大小写
(缩进后一个额外空格),第一个
大小写
块中的
[]
[g']
模式(缩进后两个额外空格),第二个
do
块中的
putStrLn
play'
语句(缩进后三个额外空格)。在输入大小写上不断给出错误(我根据建议更新了代码,仍然是相同的错误)是您的解析错误没有提示问题所在的行吗?是的,抱歉。这行:“case move gi p of”您得到了什么解析错误?您必须对齐第一个
do
块中的
i
case
(缩进后一个额外空格)、
[]
[g']
模式(缩进后两个额外空格),第二个
do
块中的
putStrLn
play'
语句(缩进后三个额外空格)。在输入大小写上不断给出错误(我根据建议更新了代码,仍然是相同的错误)是您的解析错误没有提示问题所在的行吗?是的,抱歉。这句话:“案例移动g i p of”起了作用。谢谢=)@whatscse很乐意帮忙!如果这个答案或其他任何一个已经解决了你的问题,请考虑投票表决。谢谢=)@whatscse很乐意帮忙!如果这个答案或任何其他解决了你的问题,请考虑表决它或。
   | p == O     = do i <- getNat (prompt p)
                    case move g i p of 
   | p == O     = do i <- getNat (prompt p)
                     case move g i p of 
play' :: Grid -> Player -> IO ()
play' g p 
   | wins O g   = putStrLn "Player O wins!\n " 
   | wins X g   = putStrLn "Player X wins!\n " 
   | full g     = putStrLn "It' s a draw!\n " 
   | p == O     = do i <- getNat (prompt p)
                     case move g i p of 
                        [] -> do putStrLn "ERROR: Invalid move";
                                 play' g p
                        [g'] -> play g' (next p) 
   |p == X      = do putStr "Player X is thinking... " 
                     let gs = bestmoves g p 
                     n <- randomRIO (0, length gs - 1) 
                     play (gs !! n) (next p)