Функциональное программирование

Санкт-Петербург, весна 2012

Описание

Программа занятий по функциональному программированию включает в себя лекции и решение задач на программирование в функциональном стиле на языке Haskell. Примерное содержание лекций:

Тема 1. Основы функционального программирования

Понятие о функциональном программировании; введение в Haskell; списки и определение новых типов данных в Haskell; функции высших порядков; карринг и функциональное представление данных; ленивые вычисления и бесконечные списки; потоки и завязывание узлов; регулярные выражения; представление графов; классы; другие стили функционального программирования: LISP и FP.

Тема 2. Лямбда-исчисление

Основы лямбда-исчисления; рекурсия в лямбда-исчислении и чистое лямбда-исчисление.

Тема 3. Интерпретация и компиляция функциональных программ

Представление функциональных программ; Eval/Apply интерпретатор; функциональная SECD-машина.

Тема 4. Введение в редукцию графов

Введение в редукцию графов; введение в комбинаторную редукцию; комбинаторная редукция на графах.

Студентам будет предложено для самостоятельного решения около 15 задач. Решение всех этих и некоторых других задач будут разобраны на занятиях. Общий объем курса, включающий лекции и решение задач, составляет примерно 40 часов.

Рекомендуемая литература: * А. Филд, П. Харрисон. Функциональное программирование. М.: Мир, 1993. * Р. В. Душкин Функциональное программирование на языке Haskell (+ CD-ROM)?Издательство: ДМК Пресс, 2007 г., Мягкая обложка, 608 стр. * Graham Hutton. Programming in Haskell. 2007 г., Мягкая обложка, 184 стр. * Пол Хьюдак, Джон Петерсон, Джозеф Фасел. Мягкое введение в Haskell.?RSDN Magazin, 2006 № 4 и 2007 № 1

Видео лекций можно найти по ссылке.

Преподаватели

Список лекций

Что такое функциональное программирование
  1. Что такое функциональный стиль программирования и в чем его отличие от традиционного.
  2. Почему традиционные языки программирования не подходят для программирования в функциональном стиле.
  3. Введение в язык Haskell: основные типы данных, определение функций.
  4. Интерпретаторы языка Haskell: Hugs-системы.
Списки. Функции высших порядков
  • Эффективность рекурсивных функций. Концевая рекурсия и накапливающие аргументы.
  • Списки в Haskell.
  • Определение новых типов данных в Haskell.
  • Функции высших порядков. Лямбда-выражения.
Карринг и ленивые вычисления
  • Частичная параметризация функций. Карринг и сечения.
  • Функциональное представление множеств.
  • Ленивые вычисления и бесконечные списки.
"Завязывание узлов". Классы
  • Завязывание узлов. Потоки.
  • Пример: программирование регулярных выражений.
  • Пример: функциональное представление графов.
  • Классы в Haskell.
Системы функционального программирования. Основы лямбда-исчисления
  • Другие стили функционального программирования: ЛИСП.
  • Другие стили функционального программирования: FP.
  • Основы λ-исчисления. λ-выражения и редукции. Нормальная форма.
  • Проблема конфликта имен и СЗНФ.
Чистое лямбда-исчисление
  • Рекурсия в λ-исчислении. Y-комбинатор.
  • Чистое λ-исчисление. Представление логических значений и функций, списков, арифметики целых чисел.
  • Интерпретаторы функциональных программ. Представление функциональных программ на языке Haskell.
Интерпретация и компиляция функциональных программ
  • Eval / Apply -интерпретатор.
  • Эффективная и ленивая интерпретация.
  • SECD-машина. Эффективная и ленивая версии.
Введение в редукцию графов
  • Представление последовательных процессов в функциональном программировании.
  • Введение в редукцию графов. Основной алгоритм редукции.
  • Использование вершин-синонимов при редукции графов.
Комбинаторная редукция
  • Введение в комбинаторную редукцию. Функция абстрагирования от переменных.
  • Оптимизация Карри и аппликативные подвыражения.
  • Комбинаторная редукция графов.
  • Редукция рекурсивных выражений в графах.
Письменный экзамен

ВОПРОСЫ К ЭКЗАМЕНУ

  1. Понятие о функциональном стиле программирования. Отличительные особенности этого стиля.
  2. Язык Haskell: типы, функции и задание определяющих уравнений для функций. Образцы и сопоставление с ними.
  3. Рекурсия и накапливающие параметры. Эффективность рекурсивных функций. Концевая рекурсия. Примеры.
  4. Язык Haskell: списки и операции над ними. Способы задания списков.
  5. Задание синонимов для типов данных. Определение новых типов данных, конструкторы. Параметризация типов данных.
  6. Сложные типы данных. Определение деревьев и функций их обработки. Сортировка с помощью двоичного дерева.
  7. Функции высших порядков. Отображение (map) и свертка (foldr) списков. Определение функций с помощью лямбда-выражений в Haskell.
  8. Свертка деревьев. Примеры программирования с помощью свертки сложных структур данных - деревьев и списков.
  9. Частичное применение функций. Карринг и сечение. Каррирование и декаррирование функций.
  10. Функциональное представление конечных и бесконечных множеств. Фильтрация списков.
  11. Понятие об энергичном и ленивом вычислениях. Конъюнкция и дизъюнкция по МакКарти. Бесконечные структуры данных.
  12. Встроенные в язык операции над бесконечными списками. Программа вычисления списка простых чисел способом решета Эратосфена.
  13. Графическое представление бесконечных списков как потоков. Программирование с помощью завязывания узлов. Построение списка из чисел Фибоначчи.
  14. Определение анализатора для регулярных языков с помощью функций высших порядков.
  15. Определение классов и их реализации. Расширение классов. Стандартные классы Eq, Ord и Show.
  16. Основные черты и особенности языка ЛИСП.
  17. Комбинаторное программирование. Система программирования FP Дж.Бэкуса. Примеры программ.
  18. Лямбда-исчисление: базовые понятия и правила редукций. Нормальная форма и ее единственность.
  19. Различные порядки редукций в лямбда-исчислении. Проблема конфликта имен переменных. Слабая заголовочная нормальная форма.
  20. Прямая и косвенная рекурсия в лямбда-исчислении. Комбинатор неподвижной точки. Y-комбинатор Карри.
  21. Представление констант и основных функций в чистом лямбда-исчислении: логические функции и значения, списки.
  22. Чистое лямбда-исчисление: способы представления арифметических значений и функций.
  23. Интерпретаторы и компиляторы. Перевод конструкций языков функционального программирования в расширенное лямбда-исчисление.
  24. Представление программ расширенного лямбда-исчисления в виде объектов языка Haskell. Схема интерпретации в Eval / Apply интерпретаторе.
  25. Реализация Eval / Apply интерпретатора программ. Вопрос об энергичной и ленивой схемах интерпретации.
  26. Архитектура и представление SECD-машины. Интерпретация работы энергичной SECD-машины.
  27. Функциональные эквиваленты императивных программ: представление императивной программы в виде функции состояния.
  28. Представление выражений в виде графов. Редукция графов. Решение проблемы разделения переменных. Фиктивные ссылочные узлы.
  29. Комбинаторная редукция. Основные комбинаторы и функция абстрагирования от переменных.
  30. Комбинаторная редукция: оптимизации Карри.
  31. Комбинаторная редукция: сохранение аппликативных подвыражений.
  32. Комбинаторная редукция графов.