Обзор литературы о функциональном программировании

Алексей Отт

Аннотация: За долгую историю развития функционального и декларативного программирования в мире было издано большое количество книг, посвященных теоретическим и практическим аспектам этих тематик, включая описания конкретных языков программирования. Достаточно много книг было издано также и на русском языке.

В данной статье сделана попытка провести обзор имеющейся русскоязычной литературы. Кроме того, представлен небольшой обзор существующей англоязычной литературы, имеющей отношение к данным темам. В конце статьи приводится список рекомендуемой литературы как по теоретическим вопросам ФП, так и по конкретным языкам программирования.

1  Литература на русском языке

В 70—80-е гг. в СССР было выпущено достаточно большое количество литературы, касающейся функционального и декларативного программирования. Список книг включает не только переводные книги, но и книги и учебники отечественных авторов, работавших в данных областях. В 90-е годы издание такой литературы практически сошло на нет, но в последние годы эта ситуация стала исправляться — появились переводы хороших зарубежных книг1, а также вышло несколько книг русскоязычных авторов, в том числе и учебники, разработанные специально для вузов2.

Важно отметить, что большая часть описанных ниже старых книг доступна в электронном виде, что облегчает возможность использования их при изучении соответствующих языков программирования.

1.1  Общие вопросы ФП

В данном разделе рассматриваются книги и учебники, не посвященные конкретным языкам программирования, но дающие читателю возможность получить представление о функциональном программировании, его теоретических основах, и часто — о реализации языков.

1.1.1  «Функциональное программирование» (Харрисон/Филд)

В 1993 году издательство «Мир» выпустило перевод достаточно известной книги Functional Programming [17], написанной Петером Харрисоном (Peter G. Harrison) и Антони Филдом (Anthony J. Field) в 1988 году. На русском языке она называется «Функциональное программирование» [92].

Данная книга начинается с рассмотрения функций как таковых и использования функций высшего порядка, а также рассматривает виды вычислений, используемые при функциональном стиле программирования. Для демонстрации приемов программирования в книге вводится язык Hope. Помимо Hope, кратко описываются и другие языки программирования: Lisp, Miranda, FP.

За введением в ФП (функциональное программирование) следует основная часть книги, посвященная вопросам реализации языков программирования, начиная с основ лямбда-исчисления, системы вывода и проверки типов, вопросов интерпретации и компиляции кода, представления данных, сборки мусора, и заканчивая вопросами оптимизации программ (преобразование кода во время компиляции, оптимизация ленивого вычисления данных и т. п.).

Эту книгу можно рекомендовать всем тем, кто хочет не только досконально освоить ФП, но и разобраться во внутреннем устройстве языков программирования.

1.1.2  «Введение в функциональное программирование» (Харрисон)

Данный проект является переводом курса Introduction to Functional Programming [26] Джона Харрисона (John Harrison). Этот курс может использоваться для быстрого ознакомления с основами ФП и семейством языков ML. Он содержит в себе как описание теоретических основ ФП (от лямбда-исчисления до систем типов), так и примеры применения парадигм ФП для решения конкретных задач.

В данном курсе используется язык программирования Caml Light3, входящий в семейство языков ML. По мере прохождения данного курса читатель получает набор знаний, необходимый для освоения данного языка и написания на нем достаточно сложных программ.

Перевод может использоваться как основа курса лекций по ФП — помимо конспектов лекций (lecture notes) в нем содержатся переводы всех сопутствующих слайдов. Последняя версия перевода может быть загружена с сайта проекта.

1.1.3  «Структура и интерпретация компьютерных программ»

В 2006 году был выпущен перевод на русский язык классического учебника MIT по основам программирования «Структура и интерпретация компьютерных программ» [68] (Structure & Interpretation of Computer Programs, SICP[1]). Перевод был выполнен Георгием Бронниковым.

Данная книга содержит материалы по основам программирования; показывает, как с помощью композиции несложных процедур программист может строить сложные программные системы. Особый упор делается на показ преимуществ использования абстракций и модульности программ, а в качестве примеров рассматриваются построение языка программирования, включая компиляцию, обработка символьных данных, бесконечные потоки данных и т. п.

Книга отличается от других учебников тем, что в ней описываются разные подходы к композиции программ, демонстрируются преимущества функционального подхода к построению программ, использование функций высшего порядка и т. п., а в качестве основного языка программирования используется язык Scheme.

Качество перевода книги очень высокое, однако имеются недостатки, связанные с изданием самой книги: она вышла в мягком переплете, и ее не очень удобно читать, имеются проблемы верстки и опечатки, а главное — малый тираж (всего 1000 экземпляров), в связи с чем книгу уже тяжело найти в магазинах. В то же время, ее можно найти в электронном виде.

1.1.4  Учебные курсы проекта «Интуит»

Среди учебных курсов проекта «Интуит» имеется несколько курсов, которые посвящены вопросам функционального и декларативного программирования. Некоторые из них предлагают теоретическое изложение принципов ФП, другие посвящены конкретным языкам программирования. Эти курсы могут стать хорошим подспорьем при изучении ФП, поскольку материал рассчитан на людей, только начинающих знакомиться с соответствующими темами. Практически все курсы содержат задачи и упражнения, выполняя которые можно приобрести практический опыт применения полученных знаний.

В настоящее время опубликованы следующие курсы (материалы некоторых курсов доступны также в печатном виде — книги можно заказать с сайта проекта):

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

1.1.5  «Типы в языках программирования» (Пирс)

Эта книга является переводом известной книги Types and Programming Languages Бенджамина Пирса (Benjamin C. Pierce) [55]. В книге рассматриваются различные аспекты использования типов в языках программирования: математические основы, различные типовые системы, вывод типов и т. д.

Этот перевод, также как и SICP, осуществляется Георгием Бронниковым. Бета-версии книги доступны в электронном виде, текущую версию вы можете найти на сайте проекта. Выход книги в печатном виде планируется после завершения работы над переводом, скорее всего в следующем году.

1.1.6  Другие книги, имеющие отношение к ФП

Помимо описанных выше, на русском языке было издано еще некоторое количество книг, имеющих отношение к функциональному программированию — о математических основах ФП, реализации языков и т. д. Ниже приведен краткий (и, вероятно, неполный) их список:

1.2  О конкретных языках

Наряду с книгами, описывающими общие вопросы программирования на функциональных языках и математические основы лямбда-исчисления, в СССР и России издавались и книги по конкретным функциональным и декларативным языкам программирования. Достаточно широко представлена информация о языках Lisp, Haskell и Prolog, но к сожалению практически отсутствует литература по языку Erlang.


Рис. 1: Генеалогическое дерево семейств функциональных и декларативных языков

1.2.1  Lisp

Языку Lisp, являющемуся самым старым функциональным языком, в СССР было посвящено несколько публикаций (хотя их не так много, по сравнению с языком Пролог).

В 70-х гг. было выпущено сразу несколько книг по Лиспу:

В 1990 году вышел в свет широко известный двухтомник «Мир Лиспа» [95], являющийся переводом одноименной книги финских авторов Э. Хювёнен и И. Сеппянен. В первом томе содержится описание языка Common Lisp, включая типы данных и наиболее часто используемые функции, ввод и вывод данных, обработку символьных данных и т. п. Кроме того, часть первого тома посвящена введению в методы ФП: использование рекурсии, функций высшего порядка, замыканий и макросов. Второй том содержит введение в другие методы программирования — логическое и объектное, описание среды программирования Лисп, а также большое количество примеров программ на этом языке, включая простой интерпретатор Лиспа.

1.2.2  Логическое программирование и язык Пролог

За последние тридцать лет в СССР (а затем и в России) было выпущено достаточно большое количество книг на темы логического программирования и искусственного интеллекта вообще и языка Пролог в частности (особенно много их было издано в 80-х гг.). Этот далеко не полный список включает следующие книги:

1.2.3  Haskell

В настоящее время количество русскоязычных материалов по языку Haskell невелико. Только в последние годы стали появляться книги об этом языке (упомянутые далее в статье книги Р. Душкина и Н. Рогановой, курсы проекта «Интуит») и появились энтузиасты, работающие над переводом англоязычных книг и статей на русский язык в целях популяризации Haskell среди русскоязычных программистов.

Книги о Haskell Романа Душкина

В 2006—2007 гг. Роман Душкин, читавший в МИФИ в 2001—2006 гг. курсы по ФП, выпустил две книги, посвященные языку программирования Haskell.

Первая из них называется «Функциональное программирование на языке Haskell» [78] и является учебником по ФП, с примерами на языке Haskell, и используется в ряде вузов в качестве учебного пособия по ФП. В книге рассматриваются основы лямбда-исчисления, принципы построения программ на функциональных языках, а также описывается круг типовых задач, для которых использование функциональных языков является целесообразным. Использование монад, ввод/вывод данных, классы типов (включая стандартные классы языка Haskell) и другие вопросы иллюстрируются примерами на языке Haskell. В последних двух главах рассматриваются вопросы построения трансляторов и имеющиеся в Haskell средства для этого, а также обсуждаются подходы к решению некоторых задач искусственного интеллекта на языке Haskell.

Стоит отметить, что книга содержит достаточно большое количество математики и написана суховатым языком, что делает ее излишне теоретизированой с точки зрения программиста-практика и затрудняет восприятие. Кроме того, в книге не так много примеров, которые показывали бы применимость языка в повседневной разработке (если сравнивать с книгой Real World Haskell, которая является хорошим образцом в этом деле). Еще одной вещью, затрудняющей чтение книги является качество издания — верстки самой книги и бумаги, на которой она напечатана.

Вторая книга этого же автора называется «Справочник по языку Haskell» [79] и является дополнением к первой. Книга предназначена для читателей, уже знакомых с основами языка Haskell, поэтому она не должна рассматриваться как учебник по этому языку. Она содержит краткое описание синтаксиса языка Haskell, основных типов данных, а также (что важно!) основные приемы программирования на этом языке — использование различных видов рекурсии, функций высшего порядка и анонимных функций, защитных выражений и т. д.

Основная часть книги посвящена стандартным библиотекам, входящим в состав Hugs98 & GHC: начиная с Prelude и включая основные библиотеки (Control, System, Data, Text). Для каждой библиотеки приводится описание определенных в ней типов, классов и функций. Приводимые в справочнике определения функций могут использоваться в качестве примеров по написанию «правильного» кода на Haskell и являются хорошим подспорьем в работе.

«Функциональное программирование» (Роганова)

В 2002 году Институт ИНФО издал учебное пособие Н.А. Рогановой под названием «Функциональное программирование» [88]. В данном пособии основной упор делается на практическое применение ФП для решения конкретных задач (автор выбрала задачи обработки структур данных и различные математические задачи). В нем практически нет теории, изобилующей математикой, что отличает его от других учебников по ФП. Все вводимые понятия иллюстрируются примерами на языке Haskell, который описан достаточно подробно, поэтому данное учебное пособие можно рассматривать в качестве начального по данному языку.

К недостаткам пособия можно отнести то, что отсутствие материала по теоретическим основам ФП (лямбда-исчисление и т. п.) требует изучения дополнительных материалов (которые, к сожалению, не указаны в списке литературы). Кроме того, в части описания языка Haskell мало внимания уделено таким вопросам, как ввод/вывод данных, разбор данных и т. п.

Переводы документации

М. Ландина и В. Роганов в 2005 году выполнили перевод The Haskell 98 Report  [39] — основного документа, который определяет синтаксис языка Haskell, а также состав основных библиотек этого языка. Перевод этого документа доступен с сервера haskell.ru как в варианте для печати, так и в online-версии.

Еще одна группа энтузиастов выполнила перевод на русский язык хорошо известного учебника по языку Haskell — Gentle Introduction To Haskell [33]. Данный учебник описывает основные возможности языка Haskell и наиболее часто используемые функции стандартных библиотек, включая ввод и вывод, и может использоваться для изучения основ языка. Перевод учебника доступен с сервера RSDN [94] и состоит из двух частей — часть 1 и часть 2.

1.2.4  Семейство языков ML

О семействе языков ML (Standard ML, Objective Caml, Caml Light) на русском языке существует сравнительно немного литературы. В качестве небольшого введения в программирование на языке Caml Light можно использовать курс лекций «Введение в функциональное программирование», описанный выше (1.1.1).

Кроме того, существует незаконченный перевод книги Developing Applications With Objective Caml [8] — переведено 11 глав, описывающих сам язык OCaml и базовые библиотеки, их можно использовать в качестве учебника по данному языку.

1.3  Планируется выпустить

Книга Сергиевского и Волчёнкова «Декларативное программирование» в настоящее время находится в процессе издания и должна появиться к концу этого года. Книга предназначена для использования в учебных заведениях. Она рассматривает вопросы функционального и логического программирования, включая теоретические вопросы ФП, доказательство свойств программ и т. д. Для примеров используются языки Lisp и Haskell. Отдельная часть учебника посвящена вопросам логического программирования с использованием языка Prolog.

Другие авторы также ведут работу над несколькими книгами, посвященными Haskell. Одна из них касается вопросов создания специализированных языков программирования (DSL) средствами языка Haskell, включая создание синтаксических анализаторов, а также ряда связаных с этим тем. Еще одна книга будет посвящена практическим аспектам использования Haskell с целью показать применимость языка Haskell для решения «реальных» задач.

Также в последнее время ведется работа над переводом на русский язык книги Practical Common Lisp. Книга содержит достаточно подробное введение в язык Common Lisp и содержит большое количество практических примеров, которые помогают начать использование этого языка в повседневной работе. Работа над переводом находится в заключительной стадии, а переведенный материал доступен на сайте проекта.

2  Англоязычная литература

На английском языке издано большое количество книг по ФП, его теоретическим основам, а также функциональным языкам программирования. Хотя некоторые книги и были переведены на русский, количество публикаций на английском языке гораздо больше. Краткие рецензии на некоторые из них приведены в этом разделе.

2.1  Общие вопросы ФП

В данном списке собраны книги, посвященные общим вопросам разработки ПО на функциональных языках, а также теоретическим вопросам ФП:

2.2  Реализация языков программирования

Вопросы реализации функциональных языков программирования рассматриваются в некоторых описанных выше книгах, посвященных теории ФП, но кроме этого, существуют книги, посвященные исключительно вопросам реализации таких языков программирования:

2.3  Конкретные языки ФП

Ниже перечислены наиболее интересные книги на английском языке, посвященные конкретным функциональным языкам программирования.

2.3.1  Haskell

Среди публикаций, посвященных языку Haskell, я хотел бы отметить следующие:

Кроме напечатанных книг и учебников, имеются и материалы, доступные online. К наиболее интересным можно отнести:

2.3.2  Erlang

Книга Programming Erlang. Software for a Concurrent World [2], написанная Джо Армстронгом (Joe Armstrong), является практически единственным доступным печатным изданием, посвященным языку Erlang, поскольку выпущенная ранее книга «Concurrent Programming in Erlang» [3] стала уже библиографической редкостью (в интернете можно найти первую часть этой книги). «Programming Erlang» описывает язык простым языком и знакомит читателя с его основным функционалом. Кроме самого языка, книга описывает более сложные темы: базы данных, использование OTP и т. п.

Кроме того, в этом году планируется выпуск следующих книг, посвященных как самому языку Erlang, так и применению его в конкретных задачах:

2.3.3  Caml & Objective Caml

Вопросам программирования на языке Objective Caml (OCaml) посвящено несколько книг.

Наиболее известной является свободно доступная книга Developing Applications with Objective Caml [8], которая не только описывает сам язык OCaml, но и рассматривает различные вопросы программирования с его использованием.

Недавно также появилась свободно распространяемая книга Introduction to Objective Caml [30], которая содержит достаточно подробное описание языка и примеры его применения.

Книга OCaml for Scientists [27] посвящена вопросам использования OCaml для «научного программирования» — обработки данных, математических вычислений, визуализации данных и оптимизации кода для лучшей производительности.

Еще одна книга — Practical OCaml [60], описывает язык OCaml и приемы программирования на нем. К сожалению, по многочисленными отзывами читателей, книга написана не очень хорошо.

Технический отчет The ZINC experiment: an economical implementation of the ML language [45], написанный Xavier Leroy в 1990 году, представляет собой подробное описание реализации языка ML и может быть интересен тем, кто интересуется внутренним устройством Caml & OCaml.

2.3.4  F#

В настоящее время по языку F# написана серия книг.

Foundations of F# [53] описывает основы языка и показывает разные методы программирования на нем, включая создание пользовательских интерфейсов и работу с базами данных.

Книга Expert F# [64] в свою очередь посвящена более сложным вопросам применения F# для разработки программ, таким как взаимодействие с кодом, написанным на других языках, использование библиотек .Net, разбор данных, асинхронное программирование и т. д.

F# for Scientists [28] является версией книги «OCaml for Scientists», адаптированной для языка F#, и содержит информацию по разным аспектам применения F# в «научном программировании» — визуализации данных, работе с базами данных, обработке данных и т. д.

Также в скором времени планируется выпуск еще нескольких книг, посвященных программированию на языке F# : Beginning F#, The Definitive Guide to F# и Functional Programming for the Real World: With Examples in F# and C#.

2.3.5  Standard ML

По языку Standard ML также выпущено достаточно большое количество книг.

Книга ML for the Working Programmer [52] является практическим введением в этот язык, описывающим сам язык и демонстрирующим некоторые приемы программирования на нем.

Книга The Little MLer [16] является кратким справочником по языку с примерами программ.

Книга «Unix System programming with Standard ML» [59] посвящена демонстрации применимости функциональных языков в повседневной работе.

Книга Elements of ML Programming, ML97 Edition [67], также описывающая сам язык и методы программирования на нем, может использоваться как введение в язык Standard ML.

Несколько книг посвящены изложению стандарта языка. К ним можно отнести книги The Definition of Standard ML [48] и The Standard ML Basis Library [22], которые содержат подробную информацию о языке и стандартной библиотеке.

2.3.6  Lisp

Кроме описанных ранее русскоязычных книг по языку Lisp, существует большое количество книг на английском языке, посвященных Lisp и его диалектам:

2.3.7  Scheme

По языку программирования Scheme также выпущено несколько книг, в настоящее время можно купить следующие из них:

Книги описывают как сам язык, так и различные аспекты его использования. Эти книги могут использоваться как справочники по языку и являются хорошим дополнением к книгам Structure and Interpretation of Computer Programs [1] и How to Design Programs [15], в которых язык Scheme использован для примеров.

2.3.8  Prolog

Количество англоязычных книг по Прологу достаточно велико. Ниже приведен лишь небольшой список имеющейся литературы — я старался отобрать наиболее интересные книги:

3  Рекомендации

Если вы хотите познакомиться с принципами создания функциональных языков программирования, то на русском языке базовую информацию вы почерпнете из книг «Функциональное программирование» [92], «Функциональное программирование. Применение и реализация» (Хендерсон) и «Реализация функциональных языков». Из книг на английском языке я могу порекомендовать книги, перечисленные в разделе «Реализация функциональных языков программирования (2.1)».

Заинтересовавшиеся Common Lisp могут начать его изучение с книги Practical Common Lisp [58] (существующей и на русском языке), которая даст информацию по основным аспектам языка. Более сложные аспекты работы с Lisp описаны в On Lisp [24], The Art of Metaobject Protocol [41], Let Over Lambda [31], Lisp in Small Pieces [56] и других англоязычных книгах (2.3.5).

Для обучения функциональному программированию на языке Haskell можно порекомендовать книгу «Introduction to Functional Programming using Haskell» Ричарда Бёрда [5]. Для желающих узнать о практическом применении Haskell хорошим выбором будет книга Real World Haskell [51], в которой приводятся практические примеры использования Haskell. Среди учебников можно отметить Yet another Haskell tutorial [35] и A Gentle Introduction to Haskell 98 [33] (также доступный на русском языке), ну и конечно раздел о Haskell в проекте Wikibooks.

В настоящее время по языку Erlang доступно не так уж много литературы — только книга Programming Erlang. Software for a Concurrent World [2] и официальная документация. Книга может быть использована для ознакомления с языком и концепциями, лежащими в основе OTP, после чего можно переходить к изучению библиотек и фреймворков, входящих в состав дистрибутива языка. Хочется надеяться, что ситуация с литературой по данному языку улучшится с выходом новых книг (2.3.1).

Для ознакомления с языками семейства ML существует достаточно много литературы. Выбравшим OCaml лучше начать с книги Introduction to Objective Caml [30], используя её вместе со справочником по языку, а потом переходить к Developing Applications with Objective Caml [8] и другим книгам из списка выше (2.3.2). А изучение F# стоит начать с Foundations of F# [53] и продолжить чтением Expert F# [64] и F# for Scientists [28].

Для Prologа выбор книг достаточно велик — начать можно с книги Братко «Программирование на языке Пролог для искусственного интеллекта» [72], а затем переходить к книгам на английском языке, перечисленным выше (2.3.7).

4  Заключение

Хотелось бы отметить, что появившаяся тенденция к изданию на русском языке книг по тематике функционального/декларативного программирования не может не радовать. В печати появляются как переводы отличных зарубежных книг, так и публикации отечественных авторов. Некоторые книги зарубежных авторов переводятся силами энтузиастов, что часто позволяет получить очень качественный с технической точки зрения перевод.

Список литературы

[1]
Harold Abelson and Gerald J. Sussman. Structure and Interpretation of Computer Programs, 2nd Edition. The MIT Press, 1996.
[2]
Joe Armstrong. Programming Erlang: Software for a Concurrent World. Pragmatic Programmers, 2007.
[3]
Joe Armstrong, Robert Virding, Claes Wikström, and Mike Williams. Concurrent Programming in Erlang, Second Edition. Prentice-Hall, 1996.
[4]
H. P. Barendregt. The Lambda Calculus: its Syntax and Semantics. North-Holland, 1981.
[5]
R. S. Bird. Introduction to Functional Programming Using Haskell, 2nd Edition. Prentice-Hall, 2nd edition, 1998.
[6]
Max Bramer. Logic Programming with Prolog. Springer, 2005.
[7]
Francesco Cesarini and Simon Thompson. Erlang Programming. O’Reilly, 2009.
[8]
Emmanuel Chailloux, Pascal Manoury, and Bruno Pagano. Developing Applications With Objective Caml. O’Reilly, 2000.
[9]
W.F. Clocksin and C.S. Mellish. Programming in Prolog: Using the ISO Standard, 5th Edition. Springer, 2003.
[10]
William F. Clocksin. Clause and Effect: Prolog Programming for the Working Programmer. Springer, 2003.
[11]
Guy Cousineau and Michel Mauny. The Functional Approach to Programming. Cambridge University Press, 1998.
[12]
Michael A. Covington, Donald Nute, and Andre Vellino. Prolog Programming in Depth. Prentice Hall, 1996.
[13]
Kees Doets and Jan van Eijck. The Haskell Road to Logic, Maths and Programming. College Publications, 2004.
[14]
R.K. Dybvig. The Scheme Programming Language. The MIT Press, 3rd edition, 2003.
[15]
Matthias Felleisen, Robert Bruce Findler, Matthew Flatt, and Shriram Krishnamurthi. How to Design Programs: An Introduction to Programming and Computing. The MIT Press, 2001.
[16]
Matthias Felleisen and Daniel P. Friedman. The Little MLer. The MIT Press, 1997.
[17]
A. J. Field and P. G. Harrison. Functional Programming. Addison-Wesley, 1988.
[18]
Raphael Finkel. Advanced Programming Language Design. Addison Wesley, 1995.
[19]
Daniel P. Friedman, William E. Byrd, and Oleg Kiselyov. The Reasoned Schemer. The MIT Press, 2005.
[20]
Daniel P. Friedman and Matthias Felleisen. The Seasoned Schemer. The MIT Press, 1995.
[21]
Daniel P. Friedman, Matthias Felleisen, and Gerald J. Sussman. The Little Schemer, 4th Edition. The MIT Press, 1995.
[22]
Emden R. Gansner and John H. Reppy. The Standard ML Basis Library. Cambridge University Press, 2002.
[23]
N.G. Gerakines. Erlang Web Applications: Problem-Design-Solution. John Wiley and Sons, 2009.
[24]
Paul Graham. On Lisp. Prentice Hall, 1993.
[25]
Paul Graham. ANSI Common LISP. Prentice Hall, 1995.
[26]
John Harrison. Introduction to functional programming. Lecture notes, 1997.
[27]
Jon Harrop. OCaml for Scientists. 2007.
[28]
Jon Harrop. F# for Scientists. Wiley-Interscience, 2008.
[29]
P. Henderson. Functional Programming: Application and Implementation. Prentice-Hall, 1980.
[30]
Jason Hickey. Introduction to objective caml, 2008.
[31]
Doug Hoyte. Let Over Lambda. Lulu.com, 2008.
[32]
Paul Hudak. The Haskell School of Expression: Learning Functional Programming through Multimedia. Cambridge University Press, 2000.
[33]
Paul Hudak, John Peterson, and Joseph Fasel. A gentle introduction to haskell, version 98.
[34]
Graham Hutton. Programming in Haskell. Cambridge University Press, 2007.
[35]
Hal Daumé III. Yet another haskell tutorial. Учебник, http://darcs.haskell.org/yaht/yaht.pdf.
[36]
Richard Jones and Rafael Lins. Garbage Collection: Algorithms for Automatic Dynamic Memory Management. Wiley, 1996.
[37]
Simon L. Peyton Jones. The Implementation of Functional Programming Languages. Computer Science. Prentice-Hall, 1987.
[38]
Simon L. Peyton Jones and David Lester. Implementing functional languages: a tutorial. 1992.
[39]
Simon Peyton Jones. Haskell 98 language and libraries. the revised report, 2002.
[40]
Sonya E. Keene. Object-Oriented Programming in Common Lisp: A Programmer’s Guide to CLOS. Addison-Wesley Professional, 1989.
[41]
Gregor Kiczales, Jim des Rivieres, and Daniel G. Bobrow. The Art of the Metaobject Protocol. The MIT Press, 1991.
[42]
Shriram Krishnamurthi. Programming Languages: Application and Interpretation. 2003.
[43]
David B. Lamkins. Successful Lisp: How to Understand and Use Common Lisp. bookfix.com, 2004.
[44]
Saunders Mac Lane. Categories for the Working Mathematician. Springer Verlag, 1998.
[45]
Xavier Leroy. The zinc experiment: an economical implementation of the ml language. Technical report 117, INRIA, 1990.
[46]
Martin Logan, Eric Merritt, and Richard Carlsson. Concurrent Programming with Erlang/OTP. Manning, 2009.
[47]
W. D. Maurer. The programmer’s introduction to LISP. London, Macdonald, 1972.
[48]
R. Milner, M. Tofte, and B. Harper. The Definition of Standard ML. MIT Press, 1990.
[49]
Peter Norvig. Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp. Morgan Kaufmann, 1991.
[50]
Chris Okasaki. Purely Functional Data Structures. Cambridge University Press, 1998.
[51]
Bryan O’Sullivan, Donald Stewart, and John Goerzen. Real World Haskell. O’Reilly Media, Inc., 2008.
[52]
Lawrence C. Paulson. ML for the Working Programmer, 2ed. Cambridge University Press, 1996.
[53]
Robert Pickering. Foundations of F#. Apress, 2007.
[54]
Benjamin C. Pierce. Basic Category Theory for Computer Scientists. The MIT Press, 1991.
[55]
Benjamin C. Pierce. Types and Programming Languages. MIT Press, 2002.
[56]
Christian Queinnec. Lisp in Small Pieces. Cambridge University Press, 2003.
[57]
Fethi A. Rabhi and Guy Lapalme. Algorithms: A Functional Programming Approach. Addison Wesley, 1999.
[58]
Peter Seibel. Practical Common Lisp. Apress, 2005.
[59]
Anthony L. Shipman. Unix System Programming with Standard ML. 2001.
[60]
Joshua B. Smith. Practical OCaml. Apress, 2006.
[61]
Guy Steele. Common LISP. The Language, 2ed. Digital Press, 1990.
[62]
Leon Sterling and Ehud Shapiro. The Art of Prolog: Advanced Programming Techniques. The MIT Press, 1986.
[63]
John Stobo. Problem Solving with Prolog. Pitman, 1989.
[64]
Don Syme, Adam Granicz, and Antonio Cisternino. Expert F#. Apress, 2007.
[65]
Simon Thompson. Haskell: The Craft of Functional Programming, 2nd Edition. Addison-Wesley, 1999.
[66]
Franklyn A. Turbak and David K. Gifford. Design Concepts in Programming Languages. The MIT Press, 2008.
[67]
Jeffrey D. Ullman. Elements of ML Programming, ML97 Edition, 2ed. Prentice Hall, 1998.
[68]
Харольд Абельсон and Джеральд Джей Сассман. Структура и интерпретация компьютерных программ. М.: Добросвет, 2006.
[69]
А. Адаменко and А. Кучуков. Логическое программирование и Visual Prolog. БХВ-Петербург, 2003.
[70]
Х. Барендрегт. Ламбда-исчисление. Его синтаксис и семантика. М.: Мир, 1985.
[71]
И. Братко. Программирование на языке PROLOG для искусственного интеллекта. М.: Мир, 1990.
[72]
И. Братко. Алгоритмы искусственного интеллекта на языке Prolog. Вильямс, 2004.
[73]
Л. В. Городняя. Основы функционального программирования.
[74]
Л. В. Городняя. Парадигмы программирования.
[75]
Л. В. Городняя and Н.А. Березин. Введение в программирование на Лиспе.
[76]
С. П. Джонс and Д. Лестер. Реализация функциональных языков. 1992.
[77]
Дж. Доорс, А. Р. Рейблейн, and С. Вадера. Пролог - язык программирования будущего. М.: Финансы и статистика, 1990.
[78]
Р. В. Душкин. Функциональное программирование на языке Haskell. М.: ДМК Пресс, 2007.
[79]
Р. В. Душкин. Справочник по языку Haskell. М.: ДМК Пресс, 2008.
[80]
С. В. Зыков. Введение в теорию программирования. Функциональный подход.
[81]
В. М. Зюзьков. Математическое введение в декларативное программирование, 2003.
[82]
Ц. Ин and Д. Соломон. Использование Турбо-Пролога. М.: Мир, 1990.
[83]
С. С. Лаврова and Г. С. Силагадзе. Автоматическая обработка данных. Язык ЛИСП и его реализация. М.: Наука, 1978.
[84]
Дж. Макаллистер. Искусственный интеллект и Пролог на микроЭВМ. М.: Машиностроение, 1990.
[85]
С. Маклейн. Категории для работающего математика. Физматлит, 2004.
[86]
Дж. Малпас. Реляционный язык Пролог и его применение. М.: Наука, 1990.
[87]
Н. Н. Непейвода. Стили и методы программирования.
[88]
Н. А. Роганова. Функциональное программирование, 2002.
[89]
Л. Стерлинг and Э. Шапиро. Искусство программирования на языке Пролог. М.: Мир, 1990.
[90]
Дж. Стобо. Язык программирования Пролог. М.: Радио и связь, 1993.
[91]
Клоксин У. and Меллиш К. Программирование на языке пролог. М.: Мир, 1987.
[92]
А. Филд and П. Харрисон. Функциональное программирование. М.: Мир, 1993.
[93]
П. Хендерсон. Функциональное программирование. Применение и реализация. М.: Мир, 1983.
[94]
Пол Хьюдак, Джон Петерсон, and Джозеф Фасел. Мягкое введение в haskell. Учебник.
[95]
Э. Хювёнен and И. Сеппянен. Мир Лиспа. М.: Мир, 1990.
[96]
С. Чери, Г. Готлоб, and Л. Танка. Логическое программирование и базы данных. М.: Мир, 1992.
[97]
П. А. Шрайнер. Основы программирования на языке Пролог.

1
Очень часто они переводились силами энтузиастов функционального программирования.
2
Тут необходимо отметить серию учебников и учебных курсов проекта Интуит, описанных ниже.
3
Хочется отметить, что ведется работа над версией курса лекций, адаптированной для языка OCaml, который является развитием Caml Light, но не полностью совместим с ним.
4
Это, к сожалению, беда многих советских и российских учебников.
5
Продолжение — continutation.

Этот документ был получен из LATEX при помощи HEVEA