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
我正在使用 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