Введение

В информатике и математической логике тип функции (или тип стрелки, или экспоненциальный тип) — это тип переменной или параметра, которому может быть присвоена функция, либо тип аргумента или результата функции высшего порядка, принимающей или возвращающей функцию. Тип функции зависит от типов параметров и типа результата функции (он, или точнее, непримененный конструктор типа · → ·, является типом высшего рода). В теоретических построениях и языках программирования, где функции определены в каррированной форме, таких как просто типизированное лямбда-исчисление, тип функции зависит ровно от двух типов: области определения A и области значений B. Здесь тип функции часто обозначается как A → B, следуя математической традиции, или B^(A), исходя из того, что существует ровно B^(A) (экспоненциально много) теоретико-множественных функций, отображающих A в B в категории множеств. Класс таких отображений или функций называется экспоненциальным объектом. Каррирование делает тип функции сопряженным к типу произведения; это подробно рассматривается в статье о каррировании. Тип функции можно рассматривать как частный случай зависимого типа произведения, который, помимо прочего, включает в себя понятие полиморфной функции.

Денотационная семантика

Тип функции в языках программирования не соответствует пространству всех функций теории множеств. Если рассматривать счетно бесконечный тип натуральных чисел как область определения и булевы значения как область значений, то между ними существует несчетно бесконечное число (2ℵ₀ = c) функций теории множеств. Очевидно, что это пространство функций больше, чем число функций, которые могут быть определены в любом языке программирования, поскольку существует лишь счетное количество программ (программа – это конечная последовательность конечного числа символов), и одна из функций теории множеств эффективно решает проблему останова. Денотационная семантика занимается поиском более подходящих моделей (называемых доменами) для моделирования концепций языков программирования, таких как типы функций. Оказывается, что ограничение выражений множеством вычислимых функций также недостаточно, если язык программирования позволяет записывать вычисления, которые не завершаются (что имеет место, если язык программирования является Тьюринг-полным). Выражения должны быть ограничены так называемыми непрерывными функциями (соответствующими непрерывности в топологии Скотта, а не непрерывности в реальном аналитическом смысле). Даже в этом случае множество непрерывных функций содержит параллельную или функцию, которую нельзя корректно определить во всех языках программирования.