Программирование на языке OCaml
Покупка
Тематика:
Программирование и алгоритмизация
Издательство:
ДМК Пресс
Перевод:
Киселев Артём Николаевич
Год издания: 2017
Кол-во страниц: 536
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
Дополнительное образование
ISBN: 978-5-97060-561-5
Артикул: 487694.03.99
Эта книга введет вас в мир OCaml, надежный язык программирования, обладающий большой выразительностью, безопасностью и быстродействием. Пройдя через множество примеров, вы быстро поймете, что OCaml - это превосходный инструмент, позволяющий писать быстрый, компактный и надежный системный код. Вы познакомитесь с основными понятиями языка, узнаете о приемах и инструментах, помогающих превратить OCaml в эффективное средство разработки практических приложений. В конце книги вы сможете углубиться в изучение тонких особенностей инструментов компилятора и среды выполнения OCaml.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
- 09.03.04: Программная инженерия
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Программирование на языке OCaml Ярон Мински, Анил Мадхавапедди и Джейсон Хикки
Real World OCaml Bruce A. Tate
Программирование на языке OCaml Москва, 2017 Ярон Мински, Анил Мадхавапедди и Джейсон Хикки
УДК 004.6 ББК 32.973.26 М57 Мински Я., Мадхавапедди А., Хикки Дж. М57 Программирование на языке OCaml / пер. с анг.л А. Н. Киселева. – М.: ДМК Пресс, 2017. – 536 с.: ил. Эта книга введет вас в мир OCaml, надежный язык программирования, обладаю щий большой выразительностью, безопасностью и быстродействием. Пройдя через множество примеров, вы быстро поймете, что OCaml – это превосходный инструмент, позволяющий писать быстрый, компактный и надежный системный код. Вы познакомитесь с основными понятиями языка, узнаете о приемах и инструмен тах, помогающих превратить OCaml в эффективное средство разработки практических приложений. В конце книги вы сможете углубиться в изучение тонких особенностей инструментов компилятора и среды выполнения OCaml. УДК 004.6 ББК 32.973.26 Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность технических ошибок все равно существует, издательство не может гарантировать абсолютную точность и правильность приводимых сведений. В связи с этим издательство не несет ответственности за возможные ошибки, связанные с использованием книги. ISBN 978-1-449-32391-2 (анг.) © 2014 Yaron Minsky, Anil Madhavapeddy, Jason Hickey ISBN 978-5-97060-561-5 (рус.) © Оформление, перевод, ДМК Пресс ISBN 978-5-97060-561-5
Моей Лайзе, верящей в силу слов и помогшей мне найти меня. – Ярон Моим маме и папе, отведшим меня в библиотеку и освободившим мое воображение. – Анил Моей Нобу, наполняющей каждый мой день новыми событиями. – Джейсон
Содержание Вступление ...............................................................................................................................14 Часть I. Основы языка .....................................................................................................22 Глава 1. Введение ...............................................................................................................23 OCaml как калькулятор .............................................................................................................23 Функции и автоматический вывод типов ...........................................................................25 Автоматический вывод типов ..........................................................................................27 Автоматический вывод обобщенных типов ................................................................28 Кортежи, списки, необязательные значения и сопоставление с образцом ..............30 Кортежи ...................................................................................................................................30 Списки ......................................................................................................................................31 Необязательные значения .................................................................................................38 Записи и варианты ......................................................................................................................40 Императивное программирование.........................................................................................42 Массивы ...................................................................................................................................42 Изменяемые поля записей ................................................................................................43 Ссылки .....................................................................................................................................45 Циклы for и while .................................................................................................................46 Законченная программа ............................................................................................................48 Компиляция и запуск ..........................................................................................................48 Что дальше .....................................................................................................................................49 Глава 2. Переменные и функции ............................................................................50 Переменные....................................................................................................................................50 Сопоставление с образцом и let .......................................................................................53 Функции..........................................................................................................................................54 Анонимные функции ..........................................................................................................55 Функции нескольких аргументов ...................................................................................57 Рекурсивные функции ........................................................................................................59 Префиксные и инфиксные операторы ..........................................................................60 Объявление функций с помощью ключевого слова function ................................65 Аргументы с метками ..........................................................................................................66 Необязательные аргументы ..............................................................................................69 Глава 3. Списки и образцы ..........................................................................................77 Основы списков ............................................................................................................................77 Использование сопоставления с образцом для извлечения данных из списка .....78 Ограничения (и благословения) сопоставления с образцом .......................................80 Производительность ...........................................................................................................81 Определение ошибок ..........................................................................................................83
Содержание 7 Эффективное использование модуля List ..........................................................................84 Другие полезные функции из модуля List .................................................................88 Хвостовая рекурсия ....................................................................................................................91 Компактность и скорость сопоставления с образцом .....................................................93 Глава 4. Файлы, модули программы.................................................................98 Программы в единственном файле ........................................................................................98 Программы и модули из нескольких файлов .................................................................. 101 Сигнатуры и абстрактные типы ........................................................................................... 103 Конкретные типы в сигнатурах ............................................................................................ 106 Вложенные модули .................................................................................................................. 107 Открытие модулей .................................................................................................................... 109 Подключение модулей ............................................................................................................ 111 Типичные ошибки при работе с модулями ...................................................................... 113 Несовпадение типов ......................................................................................................... 113 Отсутствие определений ................................................................................................. 114 Несоответствие определений типов ........................................................................... 114 Циклические зависимости ............................................................................................. 115 Проектирование с применением модулей ........................................................................ 117 Старайтесь не экспортировать конкретные типы .................................................. 117 Продумывайте синтаксис вызовов .............................................................................. 117 Создавайте однородные интерфейсы ......................................................................... 118 Определяйте интерфейсы до реализации ................................................................. 119 Глава 5. Записи .................................................................................................................. 120 Сопоставление с образцом и полнота ................................................................................ 122 Уплотнение полей ..................................................................................................................... 124 Повторное использование имен полей .............................................................................. 125 Функциональные обновления .............................................................................................. 129 Изменяемые поля ..................................................................................................................... 131 Поля первого порядка ............................................................................................................. 132 Глава 6. Варианты ........................................................................................................... 137 Универсальные образцы и рефакторинг ........................................................................... 139 Объединение записей и вариантов ..................................................................................... 141 Варианты и рекурсивные структуры данных.................................................................. 145 Полиморфные варианты ........................................................................................................ 149 Пример: и снова о цветных терминалах .................................................................... 151 Когда следует использовать полиморфные варианты.......................................... 157 Глава 7. Обработка ошибок ..................................................................................... 159 Типы возвращаемых значений с признаком ошибки ................................................... 159 Кодирование ошибок в результате .............................................................................. 160 Error и Or_error .................................................................................................................. 161
Содержание Функция bind и другие идиомы обработки ошибок ............................................. 163 Исключения ................................................................................................................................ 165 Вспомогательные функции для возбуждения исключений ............................... 167 Обработчики исключений .............................................................................................. 169 Восстановление работоспособности после исключений ..................................... 169 Перехват определенных исключений ......................................................................... 170 Трассировка стека .............................................................................................................. 172 От исключений к типам с информацией об ошибках и обратно ...................... 174 Выбор стратегии обработки ошибок .................................................................................. 175 Глава 8. Императивное программирование ............................................. 177 Пример: императивные словари .......................................................................................... 177 Элементарные изменяемые данные ................................................................................... 182 Данные в формах, подобных массивам ...................................................................... 182 Изменяемые поля записей и объектов и ссылочные ячейки ............................. 183 Внешние функции ............................................................................................................. 184 Циклы for и while ..................................................................................................................... 184 Пример: двусвязные списки .................................................................................................. 186 Изменение списка ............................................................................................................. 188 Итеративные функции .................................................................................................... 189 Отложенные вычисления и другие благоприятные эффекты .................................. 190 Мемоизация и динамическое программирование ................................................. 192 Ввод и вывод ............................................................................................................................... 200 Терминальный ввод/вывод ............................................................................................ 200 Форматированный вывод с помощью printf ............................................................ 202 Файловый ввод/вывод .................................................................................................... 204 Порядок вычислений ............................................................................................................... 207 Побочные эффекты и слабый полиморфизм .................................................................. 209 Ограничение значений .................................................................................................... 210 Частичное применение и ограничение значения ................................................... 211 Ослабление ограничения значений ............................................................................ 212 В заключение .............................................................................................................................. 215 Глава 9. Функторы ........................................................................................................... 216 Простейший пример ................................................................................................................ 216 Более практичный пример: вычисления с применением интервалов .................... 218 Создание абстрактных функторов .............................................................................. 222 Совместно используемые ограничения ..................................................................... 223 Деструктивная подстановка .......................................................................................... 225 Использование нескольких интерфейсов ................................................................. 227 Расширение модулей ............................................................................................................... 231 Глава 10. Модули первого порядка .................................................................. 235 Приемы работы с модулями первого порядка ................................................................ 235
Содержание 9 Пример: фреймворк обработки запросов ......................................................................... 241 Реализация обработчика запросов .............................................................................. 242 Диспетчеризация запросов по нескольким обработчикам ................................. 244 Загрузка и выгрузка обработчиков запросов ........................................................... 248 Жизнь без модулей первого порядка ................................................................................. 252 Глава 11. Объекты ........................................................................................................... 253 Объекты OCaml ........................................................................................................................ 253 Полиморфизм объектов .......................................................................................................... 255 Неизменяемые объекты .......................................................................................................... 257 Когда следует использовать объекты ................................................................................. 258 Подтипизация ............................................................................................................................ 259 Подтипизация в ширину ................................................................................................. 259 Подтипизация в глубину ................................................................................................ 260 Вариантность ...................................................................................................................... 261 Сужение ................................................................................................................................ 265 Подтипизация и рядный полиморфизм .................................................................... 267 Глава 12. Классы .............................................................................................................. 269 Классы в OCaml ........................................................................................................................ 269 Параметры класса и полиморфизм ..................................................................................... 270 Типы объектов и интерфейсы ............................................................................................... 272 Функциональные итераторы ......................................................................................... 274 Наследование ............................................................................................................................. 276 Типы классов .............................................................................................................................. 277 Открытая рекурсия .................................................................................................................. 278 Скрытые методы ........................................................................................................................ 280 Бинарные методы ...................................................................................................................... 281 Виртуальные классы и методы ............................................................................................. 285 Создание простых фигур ................................................................................................ 285 Инициализаторы ....................................................................................................................... 288 Множественное наследование .............................................................................................. 288 Как выполняется разрешение имен ............................................................................ 289 Примеси ................................................................................................................................ 290 Отображение анимированных фигур ......................................................................... 293 Часть II. Инструменты и технологии ................................................................ 295 Глава 13. Отображения и хэш-таблицы ........................................................ 296 Отображения .............................................................................................................................. 297 Создание отображений с компараторами ................................................................. 298 Деревья .................................................................................................................................. 301 Полиморфные компараторы.......................................................................................... 302 Множества ........................................................................................................................... 304
Содержание Соответствие интерфейсу Comparable.S .................................................................. 304 Хэш-таблицы .............................................................................................................................. 307 Соответствие интерфейсу Hashable.S ........................................................................ 310 Выбор между отображениями и хэш-таблицами ........................................................... 311 Глава 14. Анализ командной строки ................................................................ 315 Простейший анализ командной строки ............................................................................ 315 Анонимные аргументы .................................................................................................... 316 Определение простых команд ....................................................................................... 317 Выполнение простых команд ........................................................................................ 317 Типы аргументов ....................................................................................................................... 319 Определение собственных типов аргументов ......................................................... 320 Необязательные аргументы и аргументы по умолчанию .................................... 321 Последовательности аргументов ................................................................................. 324 Добавление поддержки передачи именованных флагов в командной строке ..... 325 Группировка подкоманд ......................................................................................................... 327 Расширенное управление парсингом ................................................................................. 329 Типы в основе Command.Spec ....................................................................................... 330 Объединение фрагментов спецификаций ................................................................ 331 Интерактивный запрос ввода ........................................................................................ 333 Добавление аргументов с метками в функции обратного вызова .................... 335 Автодополнение командной строки средствами Bash ................................................. 336 Создание фрагментов автодополнения ..................................................................... 336 Установка фрагмента автодополнения ...................................................................... 337 Альтернативные парсеры командной строки .................................................................. 338 Глава 15. Обработка данных JSON .................................................................. 339 Основы JSON ............................................................................................................................. 339 Парсинг данных в формате JSON с помощью Yojson ................................................... 340 Выборка значений из структур JSON ............................................................................... 343 Конструирование значений JSON ..................................................................................... 346 Использование нестандартных расширений JSON ...................................................... 348 Автоматическое отображение JSON в типы OCaml ..................................................... 350 Основы ATD ........................................................................................................................ 350 Аннотации ATD ................................................................................................................. 351 Компиляция спецификаций ATD в код на OCaml ................................................ 352 Пример: запрос информации об организации в GitHub ..................................... 353 Глава 16. Парсинг с помощью OCamllex и Menhir ................................ 357 Лексический анализ и парсинг ........................................................................................... 358 Определение парсера ............................................................................................................... 360 Описание грамматики ...................................................................................................... 360 Парсинг последовательностей ...................................................................................... 362 Определение лексического анализатора........................................................................... 364