Я окунаю свой палец в бассейн Хаскелла, и я начинаю его разглядывать. По большей части отсутствие традиционных контрольных структур меня не слишком беспокоит. (Я исхожу из фона C/C++.) Но я немного смущен тем, как вы повторите действие. Например, если у вас есть пошаговая игра, в императивном языке, вы могли бы сделать что-то вроде этого:Повторение действия без управляющих структур
while (not somePlayerWon())
{
getNextMove();
updateGameState();
}
Это мне не ясно, как вы могли бы сделать это в Haskell. Вы могли бы сделать что-то рекурсивное как:
playARound gameState = do
nextMove <- getNextMove gameState
newGameState <- updateGameState gameState nextMove
if (not somePlayerWon newGameState)
playARound newGameState
else gameOver -- I realize this probably has to return something
Но если вы сделаете это, вы не рискуете переполнения стека? Или компилятор примет хвостовое рекурсивное определение и преобразует его в эквивалент цикла for
? Если да, то это общепринятый способ делать такие вещи?
Это очень естественный способ кодировать это, да. Переполнение стека не произойдет - компилятор действительно делает то, что эффективно устраняет хвостовой вызов. –