do 语句中的 if/then/else (Haskell)

Har*_*ock 1 monads haskell do-notation

我编写的代码块无法编译,因为 if/then/else 块没有以编译器理解的方式设置,但是我不知道如何重写它,所以它可以。

playRandomly board = do
                 let vMoves = getValidMoves board board
                 if vMoves == [] then return [] else
                 rMove <- uniform vMoves
                 let Just nBoard = runMove board rMove
                 rest <- playRandomly nBoard
                 return (rMove : rest)
Run Code Online (Sandbox Code Playgroud)

基本上,如果列表为空,该函数uniform将除以零,因此我需要一种方法来捕获它并在继续执行 do 语句之前返回空列表。有什么建议吗?

jam*_*idh 5

您可以将剩余的命令包装在一个新的do

playRandomly board = do
             let vMoves = getValidMoves board board
             if vMoves == [] 
               then return [] 
               else do
                 rMove <- uniform vMoves
                 let Just nBoard = runMove board rMove
                 rest <- playRandomly nBoard
                 return (rMove : rest)
Run Code Online (Sandbox Code Playgroud)

但是,我想警告您,如果多次执行此操作,您的代码将向外倾斜并变得不可读。为了解决这个问题,您可以分解函数,或者使用 monad 进行错误检查。