У меня есть модуль Game
, который определяет метод play, подобный этому play :: Board -> Move - > Board
.
Я хочу использовать State Monad в другом модуле с именем Playing
, который импортирует модуль Game
, чтобы я мог вызывать play
оттуда в цикле, пока Board
не достигнет определенного состояния.
Я хочу вызвать метод с игрой с Board
, который я получаю от монады состояний, а затем обновить значение монады состояния с помощью Board
, возвращенного play
.
Итак, пока цикл продолжается, я хочу получать ходы для применения к методу play
и моему текущему состоянию.
Но я совершенно запутался в том, как добиться этого таким образом, чтобы модуль Game
не знал, что я использую Монаду состояний.
Я просмотрел довольно много руководств и примеров (например, this, this, this и т. д.), и мне кажется, что я понимаю, каким образом State Monad применяется там, но, видимо, нет достаточно хорошо, чтобы абстрагироваться от этой конкретной реализации.
playing :: IO ()
playing = do
putStr $ "The board looks like:"
board <- get
putStr $ showBoard board
putStr $ "Indicate a move:"
move <- getLine
if validMove move then do
newBoard <- play board (getMove move)
if gameEnded newBoard then do
putStr $ "You win!" --stop the execution
else do
put newBoard
else do
putStr $ "Invalid move"
Я хочу, чтобы playing
был в цикле, пока он не получит конкретное Board
, которое означает, что игра закончена. И используйте Монаду состояния для отправки текущего Board
в play
и другие методы в модуле Game
, такие как gameEnded :: Board -> Bool
, showBoard :: Board -> String
и getMove :: String -> Move.
Любая помощь приветствуется
playing
- person moondaisy   schedule 02.06.2017Move
? Ваша итерация будет основана на этом источнике. Вы хотите, чтобыplaying
проверял состояние доски и возвращал индикацию того, окончена ли игра, илиplaying
просто обновит состояние доски, и вызывающий абонент решит, применить ли другой ход или прекратить? - person ryachza   schedule 02.06.2017Char
с консоли, используя. Думаю, я мог бы написать вызывающую программу, которая используетIO
запускаетplaying
, получает ходы и показывает результатBoard
, пока не решит, что игра окончена, в этом случаеplaying
может вернуть индикатор. - person moondaisy   schedule 02.06.2017playing
должен делать, но я не знаю, как обрабатывать часть State Monad и какой должна быть фирмаplaying
- person moondaisy   schedule 02.06.2017