http://www.lektorium.tv/course/?id=22797
• John Harrison. Introduction to Functional Programming.
Курс лекций по функциональному программированию, который читался в Университете Кэмбридж.
• А. Филд, П. Харрисон, Функциональное программирование, Москва “Мир”, 1993.
Большая книга для читателей, всерьёз заинтересовавшихся функциональным программированием.
Прочитав её, вы сможете не только пользоваться ФП-языками но и написать такой язык самостоя-
тельно.
• Rinus Plasmeijer and Marko van Eekelen. Functional Programming and Parallel Graph Rewriting.
В этой книге исследуются вопросы распараллеливания функциональных программ, построение ком-
пиляторов для функциональных языков.
Литература | 321
Теория категорий
Две очень хорошие книги для начинающих:
• Maarten M. Fokkinga. Gentle Introduction to Category Theory.
Также где-то в сети есть и перевод на русский.
• Steve Awodey. Category Theory.
• Eugenia Cheng, Simon Willerton aka TheCatsters. Курс видео-лекций на youtube.
http://www.scss.tcd.ie/Edsko.de.Vries/ct/catsters/linear.php
http://www.youtube.com/user/TheCatsters
Статьи по категориальным типам:
• Varmo Vene. Categorical Programming with Inductive and Coinductive Types. Phd-диссертация.
• Erik Meijer, Graham Hutton. Bananas in Space: Extending Fold and Unfold to Exponential Types.
• Martin Erwig. Categorical Programming with Abstract Data Types.
• Martin Erwig. Metamorphic Programming: Structured Recursion for Abstract Data Types.
Практика
• Conal Elliott. Denotational design with type class morphisms.
• Johan Tibell. High Performance Haskell. Слайды с выступления.
• Johan Tibel. Faster persistent data structures through hashing. Слайды с выступления.
• Simon Marlow. Parallel and Concurrent Programming in Haskell.
• Edward Z. Yang. Блог о Haskell в картинках. Много полезной информации о лени и устройстве ghc.
http://blog.ezyang.com/about/
• Oleg Kiselyov. Блог в том числе и о Haskell. Много решений интересных и нетривиальных задач. http:
//okmij.org/ftp/
Как работает GHC
• Документация GHC:
http://hackage.haskell.org/trac/ghc/wiki/Commentary
• Don Stewart. Multi-paradigm Just-In-Time Compilation. BS Thesis, 2002.
Автор пробует компилировать Haskell-код в Java-код. При этом очень доступно объясняеются внутрен-
ности STG.
• Simon Marlow, Simon Peyton Jones. The Glasgow Haskell Compiler. The Architecture of Open Source
Application, Volume 2, 2012.
• Simon Marlow, Simon Peyton Jones. Making a Fast Curry: Push/Enter vs. Eval/Apply for Higher-order
Languages. ICFP’04.
• Simon Peyton Jones. Implementing lazy functional languages on stock hardware: the Spineless Tagless G-
machine.
• Simon Marlow, Tim Harris, Roshan P. James, Simon Peyton Jones. Parallel Generational-Copying Garbage
Collection with a Block-Structured Heap. ISMM’08.
• Simon Peyton Jones, Andre Santos. A transformation-based optimizer for Haskell. Science of computer
programming, 1998.
322 | Приложения
• Simon Peyton Jones, John Launchbury. Unboxed values as first citizens in a non-strict functional programming
language. 1991.
• Simon Marlow, Simon Peyton Jones. Secrets of Glasgow Haskell Compiler inliner. 1999
Статья о тонкостях реализации прагмы INLINE.
• Simon Peyton Jones, Andrew Tolmach, Tony Hoare. Playing by the Rules, ICFP 2001
Статья о прагме RULES.
Встроенные проблемно-ориентированные языки (EDSL)
• Oleg Kiselyov. Implementing Explicit and Finding Implicit Sharing in EDSLs.
Чистое решение проблемы поиска дублирующих подвыражений.
• Andy Gill. Type-Safe Observable Sharing in Haskell.
Решение проблемы поиска дублирующих подвыражений с помощью расширения GHC, позволяющего
проводить сравнение термов по указателям.
• Conal Elliott, Sigbjorn Finne, Oege de Moor. Compiling Embedded Languages.
Отчёт о построении EDSL для анимации.
• Bruno C.d.S. Oliveira, Andres Loh. Abstract Syntax Graphs for Domain Specific Languages.
Применение графов для кодирования дублирующих подвыражений в EDSL.
• Jacques Carette, Oleg Kiselyov and Chung-chieh Shan. Finally Tagless, Partially Evaluated. Tagless Staged
Interpreters for Simpler Typed Languages.
Построение расширяемого синтаксиса с помощью классов типов.
• Wouter Sweistra. Data types a la carte.
Построение расширяемых типов. В этой статье и выше под словом “расширяемый” понимается возмож-
ность добавления к типу новых конструкторов без перекомпиляции старых.
И все-все-все
Если вдруг у вас возникли вопросы по Haskell, и рядом с вами не оказалось того, кто мог бы на них
ответить, и в книгах нет ответа, вы можете спросить у сообщества Haskell, в haskell-cafe, там вам быстро и с
радостью ответят:
http://www.haskell.org/mailman/listinfo/haskell-cafe
Сообщество Haskell славится радушием и терпимостью к начинающим. Там много информации о выпус-
ках новых библиотек, конференциях, обучающих программах и просто разговоры о том-о-сём.
Также стоит отметить журнал Monad.Reader:
http://themonadreader.wordpress.com/
Литература | 323
Обзор Hackage
Число пакетов, загруженных на Hackage, уже перевалило за 2000. В Hackage легко заблудиться. Очень
часто не разберёшься какой из пакетов выбрать. К тому же многие из них заброшены или просто не подходят
для использования в серьёзных приложениях. Но среди них есть и очень хорошие пакеты. Некоторые из них
включены в Haskell Platform. Ниже приведён тематический обзор наиболее популярных пакетов.
Стандартные библиотеки
Все приведённые в этом подразделе библиотеки включены в Haskell Platform.
Полный список библиотек для Haskell Platform можно посмотреть на сайте http://lambda.haskell.
org/hp-tmp/docs.
• Начало-всех-начал: base
Библиотека включает в себя все стандартные определения, например модули Prelude, Data.List,
Control.Monad и многие другие.
• Стандартные монады: transformers, mtl
Включает монады State, Writer, Reader и другие.
• Контейнеры: containers
Ассоциативные массивы, множества, последовательности, деревья.
Мы будем Вам очень признательны, если Вы оцените данную книгуили оставить свой отзыв на странице комментариев.
• Массивы: array
• Графы: fgl
• Архиваторы: zlib
• Вычисление по значению: deepseq
Обычная функция seq, позволяет привести данное выражение к слабой заголовочной нормальной фор-
ме, если нам всё же необходимо вычислить значение полностью, мы можем воспользоваться функцией
deepseq из одноимённой библиотеки.
• Параллельное программирование: stm и parallel
• Временная арифметика, календарь: time
• Парсинг: parsec
• Регулярные выражения: regex—base, regex—posix
• Построение структурированного текста: pretty
• Тестирование программ: HUnit, QuickCheck
• Управление файловой системой: directory
• Работа с путями к файлам/директориям: filepath
• Сетевые библиотеки: network, HTTP, cgi.
• 3д Графика: OpenGL, GLUT.
• Монадные трансформеры: transformers
Мы не коснулись этой темы, но вот краткое пояснение: монадные трансформеры позволяют комбини-
ровать несколько монад. Например, если нам нужно использовать чтение-запись в файл совместно с
изменяемым состоянием.
324 | Приложения
Эффективные типы данных
• Списки: dlist – эффективное объединение списков.
Если вы часто пользуетесь операцией ++, то необходимо заботиться о том, чтобы скобки всегда группи-
ровались вправо. Как в a++(b++(c++d)). Иначе время объединения из линейного превратится в квад-





