Рекурсии с Государственной Монадой - PullRequest
0 голосов
/ 11 сентября 2018

Я использую State-Monad из библиотеки кошек, чтобы позаботиться о состоянии карточной игры, которую я реализую в Scala.

У меня есть функция simulateGame, которая должна завершиться, как толькостатус текущего состояния Over.Функция выглядит следующим образом.

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

Функция step возвращает состояние после текущего шага.В зависимости от возвращенного состояния я хочу либо извлечь результат из состояния (это не проблема, поскольку результат закодирован, если статус Over), либо выполнить рекурсивный вызов функции simulateGame.

Я не уверен, как сопоставить шаблон в статусе и затем выполнить рекурсивный вызов.

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 11 сентября 2018

Вы можете просто соответствовать и повторять

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
...