20.5 Детализируем функции обновления состояния игры . . . . . . . . . . . . . . . . . . . . . . . . 297
20.6 Детализируем дальше . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
20.7 Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
20.8 Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
21 Музыкальный пример
299
21.1 Музыкальная нотация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Нотная запись в европейской традиции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Протокол midi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
21.2 Музыкальная запись в виде событий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
Преобразование событий во времени . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Композиция треков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Экземпляры стандартных классов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
21.3 Ноты в midi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Синонимы для нот . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
21.4 Перевод в midi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
21.5 Пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
21.6 Эффективное представление музыкальной нотации . . . . . . . . . . . . . . . . . . . . . . . . 310
21.7 Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
21.8 Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
9
Приложения
312
Начало работы с Haskell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Литература . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Книги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Тематический сборник . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
И все-все-все . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Обзор Hackage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Стандартные библиотеки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Эффективные типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
Разработка программ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
И все-все-все . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
Места . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Университеты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Компании . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
10
Предисловие
История языка Haskell начинается в 1987 году. В 1980е годы наблюдался всплеск интереса к ленивой
стратегии вычислений. Один за другим появлялись новые функциональные языки программирования. Про-
граммисты задумались и решили, объединив усилия, найти общий язык. Так появился Haskell. Он был назван
в честь одного из основателей комбинаторной логики Хаскеля Кэрри (Haskell Curry).
Новый язык должен был стать свободным языком, пригодным для исследовательской деятельности и
решения практических задач. Свободные языки основаны на стандарте, который формулируется комите-
том разработчиков. Дальше любой желающий может заняться реализацией стандарта, написать компилятор
языка. Первая версия стандарта была опубликована 1 апреля 1990 года. Haskell продолжает развиваться
и сегодня, было зафиксировано два стандарта: 1998 и 2010 года. Это стабильные версии. Но кроме них в
Haskell включается множество расширений, проходит обкат интересных идей. Сегодня Haskell переживает
бурный рост, к сожалению, эпицентры далеки от России, это Англия, Нидерланды, Америка и Австралия. Ин-
терес к Haskell вызван популярностью многопроцессорных технологий. Модель вычислений Haskell хорошо
подходит для распараллеливания. И сейчас проводятся исследования в этой области.
Haskell очень красивый и лаконичный язык. Он придётся по душе математикам, программистам, склон-
ным к поиску элегантных решений. В арсенале программиста: строгая типизация с выводом типов, функции
высшего порядка, алгебраические типы данных, алгебраические структуры. Если пока всё это звучит как
набор слов, ничего страшного, вы узнаете что это по ходу чтения книги.
Структура книги
Haskell славится высоким порогом вхождения. Он считается трудным языком для начинающих. Во многом
это связано с тем, что начинающие уже имеют приличный опыт программирования на императивных языках.
И при первом знакомстве оказывается, что этот опыт ничем не может им помочь. Они не могут найти в Haskell
аналогов привычных синтаксических конструкций и приёмов программирования. Haskell сильно отличается
от распространённых языков программирования. Но если вы совсем-совсем начинающий, скорее всего в этом