Справочник по языку Haskell
Покупка
Тематика:
Программирование и алгоритмизация
Издательство:
ДМК Пресс
Автор:
Душкин Роман Викторович
Год издания: 2023
Кол-во страниц: 541
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-89818-622-7
Артикул: 615902.03.99
Данная книга является первой книгой на русском языке, описывающей набор стандартных библиотек функционального языка программирования Haskell. В первой xасти книги кратко рассматривается синтаксис языка и способы его применения для решения задач. Во второй части описываются стандартные библиотеки языка, входящие в поставки всех современных трансляторов Haskell (GHC, HUGS и др.).
Книга станет прекрасным подспорьем для программистов, занимающихся прикладным программированием на языке Haskell, а также для студентов, изучающих функциональное программирование.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Справочник по языку Haskell Душкин Р. В. Москва, 2023 2-е издание, электронное
УДК 004.4 ББК 32.973.26-018.2 Д86 Д86 Душкин, Роман Викторович. Справочник по языку Haskell / Р. В. Душкин. — 2-е изд., эл. — 1 файл pdf : 541 с. — Москва : ДМК Пресс, 2023. — Систем. требования: Adobe Reader XI либо Adobe Digital Editions 4.5 ; экран 10". — Текст : электронный. ISBN 978-5-89818-622-7 Данная книга является первой книгой на русском языке, описывающей набор стандартных библиотек функционального языка программирования Haskell. В первой xасти книги кратко рассматривается синтаксис языка и способы его применения для решения задач. Во второй части описываются стандартные библиотеки языка, входящие в поставки всех современных трансляторов Haskell (GHC, HUGS и др.). Книга станет прекрасным подспорьем для программистов, занимающихся прикладным программированием на языке Haskell, а также для студентов, изучающих функциональное программирование. УДК 004.4 ББК 32.973.26-018.2 Электронное издание на основе печатного издания: Справочник по языку Haskell / Р. В. Душкин. — Москва : ДМК Пресс, 2016. — 540 с. — ISBN 978-5-97060-361-1. — Текст : непосредственный. Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность технических ошибок все равно существует, издательство не может гарантировать абсолютную точность и правильность приводимых сведений. В связи с этим издательство не несет ответственности за возможные ошибки, связанные с использованием книги. В соответствии со ст. 1299 и 1301 ГК РФ при устранении ограничений, установленных техническими средствами защиты авторских прав, правообладатель вправе требовать от нарушителя возмещения убытков или выплаты компенсации. ISBN 978-5-89818-622-7 © Душкин Р. В., 2007 © Издание, ДМК Пресс, 2016
Оглавление Введение 9 I. Синтаксис и идиомы языка 11 1. Функции 12 1.1. Общий вид определения функций . . . . . . . . . . . . . . . . . . . . 12 1.1.1. Детальный разбор нескольких примеров определения функций . . . . . . . . . . . . . . . . . . . . . . 13 1.1.2. Ветвление . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.1.3. Замыкания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 1.1.4. Бинарные операции . . . . . . . . . . . . . . . . . . . . . . . . 20 1.2. Технология сопоставления с образцами . . . . . . . . . . . . . . . . 23 1.2.1. Образцы вида (n + k) . . . . . . . . . . . . . . . . . . . . . . . 25 1.2.2. Именованные образцы . . . . . . . . . . . . . . . . . . . . . . 26 1.2.3. Ленивые образцы . . . . . . . . . . . . . . . . . . . . . . . . . 27 1.3. Ввод и вывод . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 1.3.1. Действия ввода/вывода . . . . . . . . . . . . . . . . . . . . . 28 1.3.2. Обработка исключений . . . . . . . . . . . . . . . . . . . . . . 32 1.4. Приёмы программирования . . . . . . . . . . . . . . . . . . . . . . . 34 1.4.1. Двумерный синтаксис . . . . . . . . . . . . . . . . . . . . . . 34 1.4.2. Рекурсия и корекурсия . . . . . . . . . . . . . . . . . . . . . . 35 1.4.3. Накапливающий параметр и хвостовая рекурсия . . . . . . . 39 1.4.4. Бесточечная нотация . . . . . . . . . . . . . . . . . . . . . . . 41 1.4.5. Анонимные функции . . . . . . . . . . . . . . . . . . . . . . . 42
Оглавление 1.4.6. Охрана . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 1.4.7. Определители списков . . . . . . . . . . . . . . . . . . . . . . 46 2. Типы данных 48 2.1. Базовые типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 2.1.1. Кортежи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 2.1.2. Списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.2. Кратко об алгебраических типах данных . . . . . . . . . . . . . . . 53 2.2.1. Перечисления . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 2.2.2. Простые структуры . . . . . . . . . . . . . . . . . . . . . . . . 56 2.2.3. Именованные поля . . . . . . . . . . . . . . . . . . . . . . . . 59 2.3. Синонимы типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 2.4. Параметрический полиморфизм . . . . . . . . . . . . . . . . . . . . . 63 2.5. Типы функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 2.5.1. Функции как программные сущности с типом . . . . . . . . 64 2.5.2. Каррирование и частичное применение . . . . . . . . . . . . 66 2.5.3. Функции высшего порядка . . . . . . . . . . . . . . . . . . . . 68 3. Классы типов и экземпляры классов 71 3.1. Класс как интерфейс . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 3.2. Контекст и прикладные функции . . . . . . . . . . . . . . . . . . . . 76 3.3. Экземпляр — связь между типом и классом . . . . . . . . . . . . . . 78 3.3.1. Экземпляры класса Logic . . . . . . . . . . . . . . . . . . . . 80 3.4. Изоморфные типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 3.4.1. Определение нескольких экземпляров для уникальной пары (класс, тип) . . . . . . . . . . . . . . . 85 3.5. Автоматическое построение экземпляров . . . . . . . . . . . . . . . 86 3.6. Окончательные замечания о системе типов в языке Haskell . . . . . 88 4. Модули 91 4.1. Система модулей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 4.1.1. Экспорт программных сущностей . . . . . . . . . . . . . . . . 92 4.1.2. Импорт сторонних модулей . . . . . . . . . . . . . . . . . . . 93 4.2. Абстракция данных при помощи модулей . . . . . . . . . . . . . . . 97 4.3. Кое-что ещё о модулях . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Оглавление 5 5. Сводная информация 100 II. Стандартные библиотеки 105 6. Стандартный модуль Prelude 108 6.1. Prelude: Алгебраические типы данных . . . . . . . . . . . . . . . . 108 6.2. Prelude: Классы и их экземпляры . . . . . . . . . . . . . . . . . . . 115 6.3. Prelude: Функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 6.4. Prelude: Операторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 7. Пакет модулей Control 172 7.1. Модуль Applicative . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 7.2. Модуль Arrow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 7.3. Модуль Concurrent . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 7.3.1. Модуль Chan . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 7.3.2. Модуль MVar . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 7.3.3. Модуль QSem . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 7.3.4. Модуль QSemN . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 7.3.5. Модуль SampleVar . . . . . . . . . . . . . . . . . . . . . . . . . 194 7.4. Модуль Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 7.5. Модуль Monad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 7.5.1. Модуль Fix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 7.5.2. Модуль Instances . . . . . . . . . . . . . . . . . . . . . . . . . 222 7.5.3. Модуль ST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 7.6. Модуль Parallel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 8. Пакет модулей Data 226 8.1. Модуль Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 8.1.1. Модуль Base . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 8.1.2. Модуль Diff . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 8.1.3. Модуль IArray . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 8.1.4. Модуль IO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 8.1.5. Модуль MArray . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 8.1.6. Модуль ST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 8.1.7. Модуль Storable . . . . . . . . . . . . . . . . . . . . . . . . . 243
Оглавление 8.1.8. Модуль Unboxed . . . . . . . . . . . . . . . . . . . . . . . . . . 245 8.2. Модуль Bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 8.3. Модуль Bool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 8.4. Модуль ByteString . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 8.4.1. Модуль Base . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 8.4.2. Модуль Char8 . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 8.4.3. Модуль Lazy . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 8.5. Модуль Char . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 8.6. Модуль Complex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298 8.7. Модуль Dynamic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 8.8. Модуль Either . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 8.9. Модуль Eq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 8.10. Модуль Fixed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304 8.11. Модуль Foldable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305 8.12. Модуль Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 8.13. Модуль HashTable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 8.14. Модуль Int . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323 8.15. Модуль IntMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 8.16. Модуль IntSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 8.17. Модуль IORef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 8.18. Модуль Ix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361 8.19. Модуль List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362 8.20. Модуль Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374 8.21. Модуль Maybe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383 8.22. Модуль Monoid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385 8.23. Модуль Ord . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 8.24. Модуль Ratio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390 8.25. Модуль Sequence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390 8.26. Модуль Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396 8.27. Модуль STRef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 8.27.1. Модуль Lazy . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402 8.27.2. Модуль Strict . . . . . . . . . . . . . . . . . . . . . . . . . . . 402 8.28. Модуль Traversable . . . . . . . . . . . . . . . . . . . . . . . . . . . 402 8.29. Модуль Tree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404 8.30. Модуль Tuple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
Оглавление 7 8.31. Модуль Typeable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408 8.32. Модуль Unique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414 8.33. Модуль Version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 8.34. Модуль Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416 9. Пакет модулей Debug 419 9.1. Модуль Trace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419 10.Пакет модулей Foreign 421 10.1. Модуль C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422 10.1.1. Модуль Error . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 10.1.2. Модуль String . . . . . . . . . . . . . . . . . . . . . . . . . . . 429 10.1.3. Модуль Types . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 10.2. Модуль ForeignPtr . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439 10.3. Модуль Marshal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444 10.3.1. Модуль Alloc . . . . . . . . . . . . . . . . . . . . . . . . . . . 445 10.3.2. Модуль Array . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 10.3.3. Модуль Error . . . . . . . . . . . . . . . . . . . . . . . . . . . 453 10.3.4. Модуль Pool . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 10.3.5. Модуль Utils . . . . . . . . . . . . . . . . . . . . . . . . . . . 459 10.4. Модуль Ptr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462 10.5. Модуль StablePtr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466 10.6. Модуль Storable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 11.Пакет модулей System 471 11.1. Модуль Cmd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 11.2. Модуль CPUTime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 11.3. Модуль Directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473 11.3.1. Модуль Internals . . . . . . . . . . . . . . . . . . . . . . . . . 482 11.4. Модуль Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 11.5. Модуль Exit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 11.6. Модуль Info . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485 11.7. Модуль IO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 11.7.1. Модуль Error . . . . . . . . . . . . . . . . . . . . . . . . . . . 497 11.7.2. Модуль Unsafe . . . . . . . . . . . . . . . . . . . . . . . . . . . 507 11.8. Модуль Locale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
Оглавление 11.9. Модуль Mem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510 11.9.1. Модуль StableName . . . . . . . . . . . . . . . . . . . . . . . . 510 11.9.2. Модуль Weak . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512 11.10.Модуль Random . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 11.11.Модуль Time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519 12.Пакет модулей Text 528 12.1. Модуль Printf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528 12.2. Модуль Read . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531 12.2.1. Модуль Lex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533 12.3. Модуль Show . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535 12.3.1. Модуль Functions . . . . . . . . . . . . . . . . . . . . . . . . . 536 Заключение 537 Литература 538
Введение Язык Haskell является динамично развивающимся функциональным языком программирования, который получает всё больше и больше сторонников во всём мире, в том числе и в России. Этот язык вырвался из рамок научных лабораторий и стал языком программирования общего назначения. Вместе с тем хорошей литературы об этом прекрасном языке программирования категорически мало, тем более на русском языке. В конце 2006 года из печати вышла первая и на текущий момент (2007 год) единственная книга на русском языке, рассматривающая функциональное программирование на языке Haskell [1]. Несмотря на то что в этой книге тема языка Haskell раскрыта практически полностью, его описание в ней страдает неполнотой и некоторой «поверхностностью». С другой стороны, достаточно серьёзная математика в книге немного отпугивает неподготовленного читателя. Поэтому книга явилась своеобразным «первым блином», который необходим для первоначального ввода в проблематику. Однако в связи с ростом популярности как языка Haskell, так и парадигмы функционального программирования, необходимо больше всевозможных материалов, охватывающих различные аспекты и предназначенных для разной целевой аудитории. Данная книга является кратким справочником по функциональному языку программирования Haskell стандарта Haskell-98 (без описания многочисленных расширений языка). В книге собрано описание знаний по успешному применению языка Haskell на практике. Она предназначена для тех, кто уже знает принципы функциональной парадигмы и сам язык Haskell. Это связано с тем, что, несмотря на то что практически всю информацию можно почерпнуть из интернета, очень часто необходимо иметь под рукой полноценный справочник, в котором мож
Введение но быстро найти ответы на специализированные вопросы. И эта книга как раз и предназначена для подобных целей. Поскольку книга названа «кратким справочником», одним из принципов, ко торым руководствовался автор при её написании, является минимизация информации и предоставление компактно выраженных знаний, с достаточной степенью полноты раскрывающих смысл конструкций языка Haskell, идиом, существующих функций и других программных объектов, определённых в стандартных библиотеках. Поэтому стиль этого справочника является более или менее сухим и выдержанным, а описание программных сущностей наиболее формализованным. Справочник разбит на две части. В первой части представлено краткое опи сание синтаксиса языка Haskell, а также наиболее часто и успешно используемые техники программирования на нём (ведь не секрет, что в каждом языке имеются свои особые методы «правильного» программирования). Во второй части описываются наиболее часто использующиеся стандартные модули, входящие в поставку двух наиболее известных трансляторов языка — HUGS 98 и GHC. Первая часть разбита на главы, каждая из которых описывает одну из пяти существующих в языке программных сущностей (и дополнительная шестая глава со сводной информацией). Главы второй части соответствуют стандартным библиотекам языка Haskell. В целях единообразия представления информации в книге используется спе циальное форматирование текста, выделяющее определённые структурные элементы. Так, наименования программных сущностей выделяются моноширинным шрифтом обычного начертания: head, True, Enum и т. д. В отличие от идентификаторов ключевые слова записываются моноширинным шрифтом с подчёркиванием: if, do, instance и т. д. Знаки операций и специальные символы при записи ограничиваются круглыми скобками, чтобы выделить и отделить знаки от основного текста: (+), (>=), (‘) и т. д., в то время как сами скобки в случае необходимости записываются в кавычках: «(», «]». Кроме того, наименования модулей, библиотек и специальных утилит также записываются моноширинным шрифтом: Prelude, Data.List и пр. Краткость — сестра таланта, как говаривал русский классик А. П. Чехов. Поэтому осталось только упомянуть, что автор чрезвычайно благодарен Роганову В. А. за помощь в создании книги, и то, что автор будет рад получить комментарии и замечания по адресу электронной почты darkus.14@gmail.com.