52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 240

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 240

+----+----+----+----+

| 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 Упражнения

• Измените диалог с пользователем. Сделайте так чтобы у игры было главное меню, в котором игрок

выбирает разные побочные функции, вроде выхода, начать новую игру, подсказка и игровое меню, в