Автор работы: Пользователь скрыл имя, 18 Ноября 2013 в 19:25, реферат
Одно из значительных мест в исследованиях по теоретическому программированию занимает функциональное программирование. Ведущиеся в течение уже трех десятилетий разработки в этой области в последнее время имеют устойчивую тенденцию к расширению. Выполнение программы на функциональном языке, говоря неформально, заключается в вызове функции, аргументами которой являются значения других функций, которые в свою очередь также могут быть суперпозициями в общем случае произвольной глубины. С точки зрения программиста, основная часть программы состоит из совокупности определений функций, как правило, рекурсивных.
ВВЕДЕНИЕ 3
1 Функциональное программирование 4
1.1 История функционального программирования 4
1.2 Свойства функциональных языков 7
1.3 Задачи, решаемые в функциональном программировании 12
2 Язык F# 13
2.1 Состав инсталляционных пакетов F# 14
2.2 Основные возможности языка 15
2.3 Библиотеки F# 17
2.4 Основные понятия языка F# 17
2.4.1 Выражения 17
2.4.2 Типы 18
2.4.3 Декларации 19
2.4.4 Проверка и вывод типов 20
2.4.5 Функции 21
2.4.6 Функциональный тип 21
2.5 Работа в F# 23
2.5.1 Примеры кода 23
2.5.2 Пример – построение множества Мандельброта 26
ЗАКЛЮЧЕНИЕ 31
СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ 32
ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ 3
1 Функциональное программирование 4
1.1 История функционального программирования 4
1.2 Свойства функциональных языков 7
1.3 Задачи, решаемые в функциональном программировании 12
2 Язык F# 13
2.1 Состав инсталляционных пакетов F# 14
2.2 Основные возможности языка 15
2.3 Библиотеки F# 17
2.4 Основные понятия языка F# 17
2.4.1 Выражения 17
2.4.2 Типы 18
2.4.3 Декларации 19
2.4.4 Проверка и вывод типов 20
2.4.5 Функции 21
2.4.6 Функциональный тип 21
2.5 Работа в F# 23
2.5.1 Примеры кода 23
2.5.2 Пример – построение множества Мандельброта 26
ЗАКЛЮЧЕНИЕ 31
СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ 32
Одно из значительных мест в исследованиях по теоретическому программированию занимает функциональное программирование. Ведущиеся в течение уже трех десятилетий разработки в этой области в последнее время имеют устойчивую тенденцию к расширению.
Выполнение
программы на функциональном языке,
говоря неформально, заключается в
вызове функции, аргументами которой
являются значения других функций, которые
в свою очередь также могут
быть суперпозициями в общем случае
произвольной глубины. С точки зрения
программиста, основная часть программы
состоит из совокупности определений
функций, как правило, рекурсивных.
Такая особенность
Теоретические основы императивного программирования были заложены ещё в 30-х годах XX века Аланом Тьюрингом и Джоном фон Нейманом. Теория, положенная в основу функционального подхода, также родилась в 20-х — 30-х годах. В числе разработчиков математических основ функционального программирования можно назвать Мозеса Шёнфинкеля (Германия и Россия) и Хаскелла Карри (Англия), разработавших комбинаторную логику, а также Алонзо Чёрча (США), создателя λ-исчисления.
Теория так и оставалась теорией, пока в начале 50-х прошлого века Джон Мак-Карти не разработал язык Lisp, который стал первым почти функциональным языком программирования и на протяжении многих лет оставался единственным таковым. Хотя Lisp всё ещё используется (как, например, и FORTRAN), он уже не удовлетворяет некоторым современным запросам, которые заставляют разработчиков программ взваливать как можно большую ношу на компилятор, облегчив тем самым свой непосильный труд. Необходимость в этом, конечно же, возникла из-за всё более возрастающей сложности программного обеспечения [2].
В связи с этим обстоятельством всё большую роль начинает играть типизация. В конце 70-х — начале 80-х годов XX века интенсивно разрабатываются модели типизации, подходящие для функциональных языков. Большинство этих моделей включали в себя поддержку таких мощных механизмов как абстракция данных и полиморфизм. Появляется множество типизированных функциональных языков: ML, Scheme, Hope, Miranda, Clean и многие другие. Вдобавок постоянно увеличивается число диалектов.
В первую очередь большинство
Языки функционального
На рисунке 1 представлена хронология возникновения функциональных языков.
Рисунок 1 – Хронология возникновения функциональных языков
1. Краткость и простота. Программы на функциональных языках обычно намного короче и проще, чем те же самые программы на императивных языках.
Для примера ниже приведено сравнение программы на C и на абстрактном функциональном языке на примере сортировки списка быстрым методом Хоара.
Быстрая сортировка Хоара на C:
void quickSort (int a[], int l, int r)
{
int i = l;
int j = r;
int x = a[(l + r) / 2];
do
{
while (a[i] < x) i++;
while (x < a[j]) j--;
if (i <= j)
{
int temp = a[i];
a[i++] = a[j];
a[j--] = temp;
}
}
while (i <= j);
if (l < j) quickSort (a, l, j);
if (i < r) quickSort (a, i, r);
}
}
Быстрая сортировка Хоара на абстрактном функциональном языке:
quickSort ([]) = []
quickSort ([h : t]) = quickSort (n | n ⊆ t, n <= h) + [h] + quickSort (n | n ⊆ t, n > h)
Пример 2 следует читать так:
1. Если список пуст, то результатом также будет пустой список.
2. Иначе (если список не пуст)
выделяется голова (первый элемент)
и хвост (список из оставшихся
элементов, который может быть
пустым). В этом случае результатом
будет являться конкатенация (сращивание)
отсортированного списка из
2. Строгая типизация. Практически все современные языки программирования являются строго типизированными языками (возможно, за исключением JavaScript и его диалектов). Строгая типизация обеспечивает безопасность. Программа, прошедшая проверку типов просто не может выпасть в операционную систему с сообщением, подобным "access violation", особенно это касается таких языков, как C/C++ и Object Pascal, где применение указателей является типичным способом использования языка. В функциональных языках большая часть ошибок может быть исправлена на стадии компиляции, поэтому стадия отладки и общее время разработки программ сокращаются. Вдобавок к этому строгая типизация позволяет компилятору генерировать более эффективный код и тем самым ускорять выполнение программ.
Рассматривая пример с быстрой сортировкой Хоара, можно увидеть, что помимо уже упомянутых отличий между вариантом на языке C и вариантом на абстрактном функциональном языке, есть ещё одно важное отличие: функция на C сортирует список значений типа int (целых чисел), а функция на абстрактном функциональном языке — список значений любого типа, который принадлежит к классу упорядоченных величин. Поэтому последняя функция может сортировать и список целых чисел, и список чисел с плавающей точкой, и список строк. Можно описать какой-нибудь новый тип. Определив для этого типа операции сравнения, возможно без перекомпиляции использовать quickSort и со списками значений этого нового типа. Это полезное свойство системы типов называется параметрическим или истинным полиморфизмом, и поддерживается большинством функциональных языков.
Ещё одной разновидностью полиморфизма является перегрузка функций, позволяющая давать различным, но в чём-то схожим функциям одинаковые имена. Типичным примером перегруженной операции является обычная операция сложения. Функции сложения для целых чисел и чисел с плавающей точкой различны, однако для удобства они носят одно и то же имя. Некоторые функциональные языки помимо параметрического полиморфизма, поддерживают и перегрузку операций.
В языке C++ имеется такое понятие,
как шаблон, которое позволяет
программисту определять полиморфные
функции, подобные quickSort. В стандартную
библиотеку C++ STL входит такая функция
и множество других полиморфных
функций. Но шаблоны C++, как и родовые
функции Ada, на самом деле порождают
множество перегруженных
В некоторых языках, например в Ada,
строгая типизация вынуждает
программиста явно описывать тип
всех значений и функций. Чтобы избежать
этого, в строго типизированные функциональные
языки встроен специальный
Описывать функции без побочных
эффектов позволяет практически
любой язык. Однако некоторые языки
поощряют или даже требуют от функции
побочных эффектов. Например, во многих
объектно-ориентированных
В чистом функциональном программировании оператор присваивания отсутствует, объекты нельзя изменять и уничтожать, можно только создавать новые путем декомпозиции и синтеза существующих. О ненужных объектах позаботится встроенный в язык сборщик мусора. Благодаря этому в чистых функциональных языках все функции свободны от побочных эффектов. Однако это не мешает этим языкам имитировать некоторые полезные императивные свойства, такие как исключения и изменяемые массивы. Для этого существуют специальные методы.
Помимо упрощения анализа
Если функциональный язык не поддерживает отложенные вычисления, то он называется строгим. На самом деле, в таких языках порядок вычисления строго определен. В качестве примера строгих языков можно привести Scheme, Standard ML и Caml.
Языки, использующие отложенные вычисления, называются нестрогими. Haskell — нестрогий язык, так же как, например, Gofer и Miranda. Нестрогие языки зачастую являются чистыми.
Информация о работе Функциональное программирование и язык F