Чтобы проверить свои навыки в Haskell, я решил, что я хотел бы реализовать самую первую игру, вы найдете в Стране Лисп/Сферы Ракетки. "Guess My Number" игра. Игра полагается на изменяемое состояние для запуска, так как она постоянно должна обновлять верхнюю и нижнюю границы программы для дома в зависимости от значения, о котором думает пользователь.Guess My Number, монадическая головной боль
Это идет немного что-то вроде этого:
> (guess)
50
> (smaller)
25
> (bigger)
37
Теперь, такого рода вещи (насколько мне известно) не совсем возможно в Haskell, вызывая некоторую функцию от РЕПЛ, которая изменяет глобального изменяемого состояния, затем печатает результат сразу после, поскольку он нарушает принцип неизменности. Поэтому все взаимодействия должны жить внутри монады IO
и/или State
. И вот где я застрял.
Возможно, я не могу объединить мой мозг с объединением монады IO
и монады State
, поэтому я могу получить вход, распечатать результаты и изменить состояние, все в той же функции.
Вот что я получил до сих пор:
type Bound = (Int, Int) -- left is the lower bound, right is the upper
initial :: Bound
initial = (1, 100)
guess :: Bound -> Int
guess (l, u) = (l + u) `div` 2
smaller :: State Bound()
smaller = do
[email protected](l, _) <- get
let newUpper = max l $ pred $ guess bd
put $ (l, newUpper)
bigger :: State Bound()
bigger = do
[email protected](_, u) <- get
let newLower = min u $ succ $ guess bd
put $ (newLower, u)
Все, что мне нужно сделать сейчас, чтобы разработать способ
- печати начального предположения
- получить команду желающих меньше/больше число
- изменить состояние соответственно
- вызывать функцию рекурсивно, чтобы потом угадать
Как скомбинировать IO
и State
элегантным способом достижения этого?
Примечание: я знаю, что это, вероятно, может быть достигнуто без использования состояния вообще; но я хочу, чтобы это оставалось верным оригиналу
Подождите, так это компьютер, который догадывается номер? – Shoe
@Jefffrey да, в версии Lisp, компьютер догадывается, а не человек; поэтому гораздо интереснее реализовать –
См. также [Управление состоянием] (http://stackoverflow.com/q/10048213/791604). –