Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВВЕДЕНИЕ.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
898.6 Кб
Скачать
  1. Алгебраические и функциональные языки

Введение

В 1903 году английский математик Бертран Рассел предложил антиномию в рамках языка классической («наивной») теории множеств Георга Кантора, которая показала несовершенство введённого им определения множества: «множество есть многое, мыслимое как единое»:

Пусть K — множество всех множеств, которые не содержат сами себя в качестве своего подмножества. Ответ на вопрос «содержит ли K само себя в качестве подмножества?» не может быть дан в принципе. Если ответом является «да», то, по определению, такое множество не должно быть элементом K. Если же «нет», то, опять же по определению, оно должно быть элементом самого себя.

В общем, куда ни кинь — всюду клин. Ситуация парадоксальна.

Данная антиномия (более известная под названием «парадокс Рассела») поколебала основы математики и формальной логики, что вынудило ведущих математиков того времени начать поиск методов её разрешения. Было предложено несколько направлений, начиная от банального отказа от теоретико-множественного подхода в математике и ограничения в использовании кванторов (интуиционизм, основоположником которого был голландский математик Лёйтзен Брауэр), до попыток аксиоматической формализации теории множеств (аксиоматика Цермело — Френкеля, аксиоматика Неймана — Бернайса — Гёделя и некоторые другие). На сегодняшний день аксиоматические теории множеств, дополненные аксиомой выбора или другими аналогичными аксиомами, как раз и служат одним из возможных оснований современной математики.

Позже австрийский философ Курт Гёдель показал, что для достаточно сложных формальных систем всегда найдутся формулы, которые невозможно вывести (доказать) в рамках данной формальной системы — первая теорема Гёделя о неполноте [7]. Данная теорема позволила ограничить поиски формальных систем, дав математикам и философам понимание того, что в сложных системах всегда будут появляться антиномии, подобные той, что предложил Б. Рассел.

В конечном итоге парадокс Рассела и запущенные им направления исследований в рамках формальных систем привели к появлению теории типов, которая, наряду с упомянутыми аксиоматическими теориями множеств и интуиционизмом, является одним из способов разрешения противоречий наивной теории множеств. Сегодня под теорией типов понимается некоторая формальная система, дополняющая наивную теорию множеств [12]. Теория типов описывает области определений и области значений функций — такие множества элементов, которые могут быть значениями входных параметров и возвращаемыми результатами функций. Общее понимание теории типов в рамках информатики заключается в том, что обрабатываемые данные имеют тот или иной тип, то есть принадлежат определённому множеству возможных значений2.

В частности, решение приведённой в начале статьи антиномии было предложено самим Б. Расселом как раз в рамках теории типов. Решение основано на том, что множество (класс) и его элементы относятся к различным логическим типам, тип множества выше типа его элементов. Однако многие математики того времени не приняли это решение, считая, что оно накладывает слишком жёсткие ограничения на математические утверждения.

В рамках общей теории типов разработано определённое количество теорий, абстракций и идиом, описывающих различные способы представления множеств значений и множеств определений функций. Одна из них — алгебраический тип данных (другими важнейшими теориями в рамках дискретной математики являются комбинáторная логика, и теория рекурсивных функций) [9, 14, 13]. Именно эта идиома и является предметом рассмотрения настоящей статьи, поскольку она имеет серьёзное прикладное значение в информатике в целом и в функциональном программировании в частности. К примеру, в языке Haskell любой непримитивный тип данных является алгебраическим.

Вместе с тем надо отметить, что в «чистой» математике типы рассматриваются как некие объекты манипуляции. Например, в типизированном, в котором явно вводится понятие типа, типы изучаются исключительно как синтаксические сущности. Типы в типизированном  — это не «множества значений», а просто «бессмысленные» наборы символов и правила манипуляции ими.

К примеру, если говорить о простом типизированном , то в нём даже нет констант типов вроде Int, Bool и т. д. Типы  — это выражения специального вида, составленные из значков (→), (*) и круглых скобок «(» и «)» по простым правилам:

  1. * — тип;

  2. если α и β — типы, то (α → β) — тип.

Другими словами, типы — это строки вида * → (* → *) → *. Именно строки, а не множества значений. Иногда, конечно, вводят и константы типов, но принципиальной разницы это не вносит.

В связи с этим в дальнейшем изложении под понятием «тип» даже в математическом смысле будет иметься в виду конкретная интерпретация для прикладного применения. Именно прикладная интерпретация математического понятия имеет значение при переходе к информатике и программированию.