Функциональное программирование
Санкт-Петербург, весна 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
Видео лекций можно найти по ссылке.
Преподаватели
Список лекций
- Что такое функциональный стиль программирования и в чем его отличие от традиционного.
- Почему традиционные языки программирования не подходят для программирования в функциональном стиле.
- Введение в язык Haskell: основные типы данных, определение функций.
- Интерпретаторы языка Haskell: Hugs-системы.
- Эффективность рекурсивных функций. Концевая рекурсия и накапливающие аргументы.
- Списки в Haskell.
- Определение новых типов данных в Haskell.
- Функции высших порядков. Лямбда-выражения.
- Частичная параметризация функций. Карринг и сечения.
- Функциональное представление множеств.
Ленивые
вычисления и бесконечные списки.
Завязывание узлов
. Потоки.- Пример: программирование регулярных выражений.
- Пример: функциональное представление графов.
- Классы в Haskell.
- Другие стили функционального программирования: ЛИСП.
- Другие стили функционального программирования: FP.
- Основы λ-исчисления. λ-выражения и редукции. Нормальная форма.
- Проблема конфликта имен и СЗНФ.
- Рекурсия в λ-исчислении. Y-комбинатор.
- Чистое λ-исчисление. Представление логических значений и функций, списков, арифметики целых чисел.
- Интерпретаторы функциональных программ. Представление функциональных программ на языке Haskell.
- Eval / Apply -интерпретатор.
- Эффективная и ленивая интерпретация.
- SECD-машина. Эффективная и ленивая версии.
- Представление последовательных процессов в функциональном программировании.
- Введение в редукцию графов. Основной алгоритм редукции.
- Использование вершин-синонимов при редукции графов.
- Введение в комбинаторную редукцию. Функция абстрагирования от переменных.
- Оптимизация Карри и аппликативные подвыражения.
- Комбинаторная редукция графов.
- Редукция рекурсивных выражений в графах.
ВОПРОСЫ К ЭКЗАМЕНУ
- Понятие о функциональном стиле программирования. Отличительные особенности этого стиля.
- Язык Haskell: типы, функции и задание определяющих уравнений для функций. Образцы и сопоставление с ними.
- Рекурсия и накапливающие параметры. Эффективность рекурсивных функций. Концевая рекурсия. Примеры.
- Язык Haskell: списки и операции над ними. Способы задания списков.
- Задание синонимов для типов данных. Определение новых типов данных, конструкторы. Параметризация типов данных.
- Сложные типы данных. Определение деревьев и функций их обработки. Сортировка с помощью двоичного дерева.
- Функции высших порядков. Отображение (map) и свертка (foldr) списков. Определение функций с помощью лямбда-выражений в Haskell.
- Свертка деревьев. Примеры программирования с помощью свертки сложных структур данных - деревьев и списков.
- Частичное применение функций. Карринг и сечение. Каррирование и декаррирование функций.
- Функциональное представление конечных и бесконечных множеств. Фильтрация списков.
- Понятие об энергичном и ленивом вычислениях. Конъюнкция и дизъюнкция
по МакКарти
.Бесконечные
структуры данных. - Встроенные в язык операции над бесконечными списками. Программа вычисления списка простых чисел способом
решета Эратосфена
. - Графическое представление бесконечных списков как потоков. Программирование с помощью
завязывания узлов
. Построение списка из чисел Фибоначчи. - Определение анализатора для регулярных языков с помощью функций высших порядков.
- Определение классов и их реализации. Расширение классов. Стандартные классы Eq, Ord и Show.
- Основные черты и особенности языка ЛИСП.
- Комбинаторное программирование. Система программирования FP Дж.Бэкуса. Примеры программ.
- Лямбда-исчисление: базовые понятия и правила редукций. Нормальная форма и ее единственность.
- Различные порядки редукций в лямбда-исчислении. Проблема конфликта имен переменных. Слабая заголовочная нормальная форма.
- Прямая и косвенная рекурсия в лямбда-исчислении. Комбинатор неподвижной точки. Y-комбинатор Карри.
- Представление констант и основных функций в чистом лямбда-исчислении: логические функции и значения, списки.
- Чистое лямбда-исчисление: способы представления арифметических значений и функций.
- Интерпретаторы и компиляторы. Перевод конструкций языков функционального программирования в расширенное лямбда-исчисление.
- Представление программ расширенного лямбда-исчисления в виде объектов языка Haskell. Схема интерпретации в Eval / Apply интерпретаторе.
- Реализация Eval / Apply интерпретатора программ. Вопрос об энергичной и ленивой схемах интерпретации.
- Архитектура и представление SECD-машины. Интерпретация работы энергичной SECD-машины.
- Функциональные эквиваленты императивных программ: представление императивной программы в виде функции состояния.
- Представление выражений в виде графов. Редукция графов. Решение проблемы разделения переменных. Фиктивные ссылочные узлы.
- Комбинаторная редукция. Основные комбинаторы и функция абстрагирования от переменных.
- Комбинаторная редукция: оптимизации Карри.
- Комбинаторная редукция: сохранение аппликативных подвыражений.
- Комбинаторная редукция графов.