- •Введение
- •Понятие функционального программирования
- •Языки функционального программирования
- •Лямбда-исчисление Введение в лямбда-исчисление
- •Алонсо Черч
- •Иллюстрация ромбического свойства на примере
- •Прикладные лямбда-исчисления
- •Данные и выражения языка Lisp. Понятия списков и атомов, вычисление функций.
- •Организация памяти Lisp-машины
- •Функции проверки типов и логические функции
- •Манипуляция элементами списков
- •Основные конструкции Лямбда - выражения и пользовательские функции
- •Последовательности вычислений
- •Условные операторы и циклы
- •Рекурсия
- •Проверка на вхождения атома в список
- •Удаление из списка n-ного элемента
- •Добавление в список элемента в позицию n
- •Функционалы
- •Макросы
- •Ввод и вывод
- •Типы данных Иерархия типов
- •Символы
- •Последовательности
- •Массивы
- •Структуры
- •Лабораторные работы Лабораторная работа 1
- •Лабораторная работа 2
- •Лабораторная работа 3
- •Дана схема метрополитена, найти кратчайший путь между станциями.
- •Игра в 15.
- •Задача о 8-ми ферзях.
- •Задача о 8-ми ферзях 2.
- •Задача о Ханойской башне.
- •Задача о составлении расписания
- •Раскрасить плоскую карту четырьмя цветами, так что бы любые две смежные области не были окрашены в один цвет
- •Задача о коммивояжере.
- •Лабораторная работа 4
Языки функционального программирования
В этом разделе приведено краткое описание некоторых языков функционального программирования (очень немногих из существующих).
Lisp (List processor). Считается первым функциональным языком программирования. Язык нетипизирован и, хотя он содержит массу императивных свойств, однако основным для Lisp является именно функциональный стиль программирования. При вычислениях использует вызов по значению. Существует объектно-ориентированный диалект языка - CLOS.
ISWIM (If you See What I Mean). Функциональный язык-прототип. Разработан Ландиным в 60-х годах для демонстрации того, каким может быть язык функционального программирования. Вместе с языком Ландин разработал и специальную виртуальную машину для исполнения программ на ISWIM. Эта виртуальная машина, основанная на вызове по значению, получила название SECD-машины. На синтаксисе языка ISWIM базируется синтаксис многих функциональных языков, особенно на него похожи ML, и, в частности, Caml.
Scheme. Диалект Lisp, предназначенный для научных исследований в области компьютерной науки. При разработке Scheme был сделан упор на элегантность и простоту языка.
ML (Meta Language). Семейство строгих языков с развитой полиморфной системой типов и параметризуемыми модулями. ML преподается во многих западных университетах, иногда даже как первый язык программирования.
Standard ML. Один из первых типизированных языков функционального программирования. Содержит некоторые императивные свойства, такие как ссылки на изменяемые значения и поэтому не является чистым. При вычислениях использует вызов-по-значению. Очень интересная реализация модульности. Мощная полиморфная система типов. Последний стандарт языка - Standard ML-97, существует формальное математическое определения синтаксиса, статической и динамической семантик языка.
Caml Light и Objective Caml. Язык принадлежит к семейству ML. Objective Caml отличается от Caml Light в основном поддержкой классического объектно-ориентированного программирования. Также как и Standard ML является строгим, но имеет некоторую встроенную поддержку отложенных вычислений.
Miranda. Язык разработан Дэвидом Тернером, в качестве стандартного функционального языка, использовавшего отложенные вычисления. Имеет строгую полиморфную систему типов. Как и ML преподаётся во многих университетах.
Haskell. Один из самых распространенных нестрогих языков. Имеет очень развитую систему типизации. Последний стандарт языка - Haskell 98. Язык Haskell очень популярен в академических кругах. Haskell очень надежен - 99% ошибок выявляются на этапе компиляции. Тем не менее, он мало распространен в производстве (хотя есть промышленные экспертные системы, написанные на Haskell).
Gofer (GOod For Equational Reasoning). Упрощенный диалект Haskell. Предназначен для обучения функциональному программированию.
Clean. Язык специально предназначен для параллельного и распределенного программирования. Чисто функциональный язык. По синтаксису напоминает Haskell. Использует отложенные вычисления. С компилятором поставляется набор библиотек, позволяющих программировать графический пользовательский интерфейс под Win32 или MacOS.
РЕФАЛ. Алгоритмический язык Рефал (Recursive functions algorithmic language), был создан в конце 60-х начале 70-х годов В.Ф.Турчиным. Рефал, как алгоритмический язык, отличается простотой, высокой степенью модульности и имманентной структурностью программ. Простая семантика Рефала повышает надежность программирования на нем, значительно облегчает трассировку и отладку программ. Рефал доказал свою состоятельность в области трансляции машинных языков, доказательства теорем, компьютерной алгебры, создания баз данных.
