28-04-2023
В информатике функциональный тип (а также стрелочный тип или экспоненциал) — тип переменной или параметра, значением которой или которого может быть функция; либо тип аргумента или возвращаемого значения функции высшего порядка, принимающей или возвращающей функцию.
Функциональный тип зависит от типов параметров и типа результата функции. Другими словами, это тип высшего рода, или, более точно, неприменённый конструктор типов «· → ·». В теоретических моделях и языках с поддержкой карринга, например в просто типизированном лямбда-исчислении, функциональный тип зависит ровно от двух типов: области определения A и области значений B. В этом случае функциональный тип, следуя математической традиции, обычно записывают как «A -> B», или как «BA», подразумевая, что существует ровно BA (экспоненциально много) теоретико-множественных функций[en], отображающих A на B.
Функциональный тип можно рассматривать как частный случай зависимого произведения типов. Среди прочих свойств, такое представление несёт в себе идею полиморфной функции.
В следующую таблицу сведён синтаксис, используемый в различных языках программирования для функциональных типов, а также соответствующие примеры сигнатуры типа для функции композиции функций.
Язык программирования | Нотация | Пример сигнатуры типа[en] | |
---|---|---|---|
С поддержкой первоклассных функций, параметрического полиморфизма |
C++11 | std::function<ρ (α1,α2,...,αn)> |
function<function<int(int)>(function<int(int)>, function<int(int)>)> compose; |
C# | Func<α1,α2,...,αn,ρ> |
Func<A,C> compose(Func<A,B> f, Func<B,C> g); |
|
Go | func(α1,α2,...,αn) ρ |
var compose func(func(int)int, func(int)int) func(int)int |
|
Haskell | α -> ρ |
compose :: (a -> b) -> (b -> c) -> a -> c |
|
Objective-C/C/C++ с блоками | ρ (^)(α1,α2,...,αn) |
int (^compose(int (^f)(int), int (^g)(int)))(int); |
|
OCaml | α -> ρ |
compose : ('a -> 'b) -> ('b -> 'c) -> 'a -> 'c |
|
Scala | (α1,α2,...,αn) => ρ |
def compose[A, B, C](f: B => C, g: A => B): A => C |
|
Standard ML | α -> ρ |
compose : ('a -> 'b) -> ('b -> 'c) -> 'a -> 'c |
|
Без первоклассных функций, параметрического полиморфизма |
Си | ρ (*)(α1,α2,...,αn) |
int (*compose(int (*f)(int), int (*g)(int)))(int); |
Следует обратить внимание, что в примере на C# функция compose
имеет тип «Func< Func<A,B>, Func<B,C>, Func<A,C> >
».
Функциональный тип в языках программирования не соответствует пространству всех теоретико-множественных функций. Если принять счётно бесконечный тип натуральных чисел в качестве области определения и тип булевых чисел в качестве области значений, то существует несчётное количество ( — мощность континуума) теоретико-множественных функций между ними. Очевидно, это множество функций заведомо шире множества функций, определимых в языках программирования, так как существует лишь счётное множество программ (где программа представляет собой конечную цепочку из символов конечного набора).
Денотационная семантика занимается поиском более подходящих моделей (называемых областями[en]), в том числе, для моделирования таких понятий языков программирования как функциональный тип. В денотационной семантике считается, что целесообразно не ограничиваться лишь вычислимыми функциями, а использовать любые непрерывные по Скотту функции на частично упорядоченных множествах, которыми возможно смоделировать также и незавершимые вычисления[en] (а таковые возникают во всяком полном по Тьюрингу языке). Средства теории областей, используемые в денотационной семантике, достаточно выразительны, например, непрерывной по Скотту функцией моделируется «parallel or
», определимый далеко не во всех языках программирования.
Типы данных | |
---|---|
Неинтерпретируемые | |
Числовые | |
Текстовые | |
Ссылочные |
Адрес • Ссылка • Ссылка в С++ • Указатель |
Композитные |
Алгебраический тип данных (обобщённый) • Массив • Ассоциативный массив • Класс • Список • Кортеж • Объект • Структура • Множество • Объединение (меченое) |
Другие |
Логический • Низший • Высший • Перечисляемый • Коллекция • Исключение • Функциональный • Род (Метакласс) • Монада • Семафор • Поток • Void |
Связанные темы |
Функциональный тип.