State-Monad 的递归

Recursions with the State-Monad

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

我有一个函数 simulateGame,它应该在当前状态为 Over 时立即结束。函数看起来像这样。

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

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

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

感谢任何帮助!

你可以只匹配和递归

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