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

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

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


step函数返回当前步骤后的状态。根据返回的状态,我想从状态中提取结果(这没问题,因为如果状态为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

10-01 17:51