【问题标题】:If/then/else in do statements (Haskell)do 语句中的 if/then/else (Haskell)
【发布时间】:2014-11-30 18:08:35
【问题描述】:

我有一个我写的代码块不能编译,因为 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 语句之前返回空列表。有什么建议吗?

【问题讨论】:

  • 只是为了好玩,我粘贴了一个备用的重新样式here。不将此作为答案,因为它并没有真正回答“什么缩进使这项工作?”的问题。

标签: haskell monads do-notation


【解决方案1】:

您可以将剩余的命令包装在一个新的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 进行错误检查。

【讨论】:

  • 就是这个,谢谢。确实考虑过拆分它,但无论如何我希望有一个像你提供的简单的内联解决方案这样一个小功能。
猜你喜欢
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多