【问题标题】:Recursions with the State-Monad与 State-Monad 的递归
【发布时间】:2019-02-15 19:59:12
【问题描述】:

我正在使用猫库中的 State-Monad 来处理我在 Scala 中实现的纸牌游戏的状态。

我有一个函数simulateGame,它应该在当前状态为Over 时立即结束。函数如下所示。

def simulateGame: GameState[Outcome] = for {
    action <- State.inspect[PlayerState, Action] { ... }
    status <- step(action)
    outcome <- ???
} yield outcome

step 函数返回当前步骤之后的状态。根据返回的状态,我想从状态中提取结果(这没问题,因为如果状态为Over,则对结果进行编码)或递归调用simulateGame 函数。

我不确定如何对状态进行模式匹配,然后进行递归调用。

感谢任何帮助!

【问题讨论】:

  • 是否需要在模拟迭代之间传递当前状态?

标签: scala functional-programming monads scala-cats state-monad


【解决方案1】:

你可以只匹配和递归

def simulateGame: GameState[Outcome] = for {
    action <- State.inspect[PlayerState, Action] { ... }
    status <- step(action)
    outcome <- status match
       case o: Over => State.pure(o)
       case _ => simulateGame
} yield outcome

【讨论】:

  • 看起来很有希望!我会试试的。我希望 cat 的 State 实现能保护我免于在 stackoverflow 中运行。
  • 他将如何在递归迭代之间传递当前状态?这只会每次产生一个新的状态。
  • @Lando-L 确实如此,因为它使用 Eval 进行蹦床执行。
  • @YuvalItzchakov 游戏状态在 State monad 中“旅行”,因此下一次模拟游戏调用将使用上一次迭代留下的状态。
  • @YuvalItzchakov 如果 step 函数修改了 monad 内部的状态,那么该状态将被传递给递归模拟游戏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 2014-09-11
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 2012-06-30
  • 2014-02-18
相关资源
最近更新 更多