if / then / else in do语句(Haskell)

时间:2014-11-30 18:08:36

标签: haskell monads 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)

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

1 个答案:

答案 0 :(得分:3)

您可以将其余命令包装在新的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)

但是,我想警告你,如果你多次这样做,你的代码将向外倾斜并变得不可读。要解决此问题,您可以拆分函数,或使用monad进行错误检查。