Основы функционального программирования/Структуры данных и базисные операции: различия между версиями
Содержимое удалено Содержимое добавлено
Первый раздел более или менее проработан... |
→Введение: <tt> -> <math> |
||
Строка 3:
== Введение ==
Как уже́ говорилось в '''[[Основы функционального программирования/Вводная лекция|первой лекции]]''', основой [[w:Функциональное программирование|функциональной парадигмы программирования]] в большей мере являются такие направления развития математической мысли, как [[w:Комбинаторная логика|комбинаторная логика]] и [[w:Лямбда-исчисление|λ-исчисление]]. В свою очередь последнее более тесно связано с функциональным программированием, и именно λ-исчисление называют теоретическими основами функционального программирования.
Для того, чтобы рассматривать теоретические основы функционального программирования, необходимо в первую очередь ввести некоторые соглашения, описа́ть обозначения и построить некоторую формальную систему.
Строка 11:
В качестве базисных операций традиционно (и в первую очередь это объясняется теоретической необходимостью) выделяются следующие три:
#Операция создания пары — <
#Операция отсечения головы — <
#Операция отсечения хвоста — <
Селективные операции отсечения головы и хвоста также называют просто селекторами. Выделенные операции связаны друг с другом следующими тремя аксиомами:
#<
#<
#<
Всё множество объектов, которые можно сконструировать из объектов первичного типа в результате произвольного применения базисных операций, носит название множество <
<center><
Для дальнейших исследований вводится фиксированный атом, который также принадлежит первичному типу <math>A</math>. Этот атом в дальнейшем будет называться «пустым списком» и обозначаться символами <
'''Определение:'''
Строка 34:
Главное свойство списка: <math>x \in List(A) \and x \neq [] \Rightarrow head(x) \in A, tail(x) \in List(A)</math>.
Для обозначения списка из <math>n</math> элементов можно употреблять множество различных нотаций, однако здесь будет использоваться только такая: <math>>[
<math>tail([a_{1}, a_{2}, \ldots, a_{n}]) = [a_{2}, \ldots, a_{n}]</math> (при <math>n > 0</math>).
Кроме списков вводится ещё один тип данных, который носит название «списочная структура над <math>A</math>» (обозначение — <math>ListStr(A)</math>), при этом можно построить следющую структуру отношений: <math>List(A) \subset ListStr(A) \subset SExpr(A)</math>. Определение списочной структуры выглядит следующим образом:
Строка 46 ⟶ 47 :
#<math>List(ListStr(A)) \in ListStr(A)</math>.
Т. е. видно, что списочная структура — это список, элементами которого могут быть как атомы, так и другие списочные структуру, в том числе и обыкновенные списки. Примером списочной структуры, которая в тоже время не является простым списком, может служить следующее выражение: <math>[
== Несколько слов о программной реализации ==
|