52700.fb2
| 13 | 14 | 15 | 12 |
+----+----+----+----+
Ваш ход:
d
+----+----+----+----+
|
1 |
2 |
3 |
4 |
+----+----+----+----+
|
5 |
6 |
7 |
8 |
+----+----+----+----+
|
9 | 10 | 11 | 12 |
+----+----+----+----+
| 13 | 14 | 15 |
|
+----+----+----+----+
Игра окончена.
Ураа, получилось. Мы так долго писали программу, проверяя лишь типы, и в самом конце, когда мы
закончили определение, всё работает. Конечно не всё работает так гладко, я уже написал эту программу и
объясняю готовое решение, но когда общая схема программы утряслась, возможные ошибки определяются
на раз. Мы могли вызвать отображение позиции не в том порядке или забыть проверку конца игры, всё это
несколько строчек изменений.
Самые неприятные ошибки происходят, когда в середине выясняется, что мы ошиблись с типами. Типы,
которые мы выбрали не могут описать явление, возможно мы не можем делать какие-то операции, которые
нам, как неожиданно выяснилось, очень нужны. Это значит, что нужно менять каркас. Менять каркас, это
значит сносить весь дом и строить новый. Возможно разрушения окажутся локальными, мы строим не дом,
а город. И сносить придётся не всё, а несколько кварталов. Но это тоже большие перемены. Поэтому шаг
определения типов очень важен. Впрочем сносить кварталы в Haskell одно удовольствие, посольку стоит
нам изменить какой-нибудь тип, например убрать какой-нибудь тип или изменить имя, компилятор тут же
подскажет нам какие функции стали бессмысленными. Более коварные изменения связаны с добавлением
конструктора-альтернативы. Например нам вдруг не понравился тип Bool и мы решили сделать его более
человечным. Мы решили добавить ещё одно значение:
data Bool = True | False | IDonTKnow
Это может привести к неполному рассмотрению альтернатив в case-выражениях и сопоставлениях с об-
разцом в аргументах функции. Такие ошибки крайн неприятны, поскольку они происходят на этапе выпол-
нения программы, когда новое значение IDonTKnow дойдёт до case. В этом случае нам на выручку может
прийти функция свёртки, если мы вместе с типом изменим и функцию свёртки, это скажется на всех функ-
циях, которые были определены через неё. Чем больше таких функций, тем больше ошибок мы поймаем.
214 | Глава 13: Поиграем
13.3 Упражнения
• Измените диалог с пользователем. Сделайте так чтобы у игры было главное меню, в котором игрок
выбирает разные побочные функции, вроде выхода, начать новую игру, подсказка и игровое меню, в