Функциональный интеграл
- 1 year ago
- 0
- 0
Функциональный тип ( стрелочный тип , экспоненциал ) в информатике — тип переменной или параметра , значением которой или которого может быть функция ; либо тип аргумента или возвращаемого значения функции высшего порядка , принимающей или возвращающей функцию.
Функциональный тип зависит от типов параметров и
типа результата
функции. Другими словами, это
тип высшего рода
, или, более точно, неприменённый
конструктор типов
«
». В теоретических моделях и языках с поддержкой
каррирования
, например в
просто типизированном лямбда-исчислении
, функциональный тип зависит ровно от двух типов:
области определения
и
области значений
. В этом случае функциональный тип, следуя математической традиции, обычно записывают как
(в практических языках программирования —
A -> B
), или как
, подразумевая, что существует ровно
, отображающих
на
. С точки зрения
соответствия Карри — Ховарда
обитаемость функционального типа
эквивалентна доказуемости
логической импликации
.
Функциональный тип можно рассматривать как частный случай зависимого произведения типов . Среди прочих свойств, такое представление несёт в себе идею полиморфной функции .
В следующую таблицу сведён синтаксис, используемый в различных языках программирования для функциональных типов, а также соответствующие примеры сигнатуры типа для функции композиции функций .
Язык программирования | Нотация | Пример | |
---|---|---|---|
С поддержкой
первоклассных функций
,
параметрического полиморфизма |
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> >
».
Функциональный тип в языках программирования не соответствует пространству всех теоретико-множественных функций. Если принять счётно бесконечный тип натуральных чисел в качестве области определения и тип булевых чисел в качестве области значений, то существует несчётное количество ( — мощность континуума ) теоретико-множественных функций между ними. Очевидно, это множество функций заведомо шире множества функций, определимых в языках программирования, так как существует лишь счётное множество программ (где программа представляет собой конечную цепочку из символов конечного набора).
занимается поиском более подходящих моделей (называемых
), в том числе, для моделирования таких понятий языков программирования как функциональный тип. В денотационной семантике считается, что целесообразно не ограничиваться лишь
вычислимыми функциями
, а использовать любые
непрерывные по Скотту функции
на
частично упорядоченных множествах
, которыми возможно смоделировать также и
(а таковые возникают во всяком
полном по Тьюрингу
языке). Средства теории областей, используемые в денотационной семантике, достаточно выразительны, например, непрерывной по Скотту функцией моделируется
«
parallel or
»
, определимый далеко не во всех языках программирования.