与State-Monad的递归

问题描述 投票:2回答:1

我正在使用来自猫库的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个回答
0
投票

你可以匹配并递归

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
© www.soinside.com 2019 - 2024. All rights reserved.