WikiSort.ru - Программирование

ПОИСК ПО САЙТУ | о проекте

Функциональный тип (стрелочный тип, экспоненциал) в информатике — тип переменной или параметра, значением которой или которого может быть функция; либо тип аргумента или возвращаемого значения функции высшего порядка, принимающей или возвращающей функцию.

Функциональный тип зависит от типов параметров и типа результата функции. Другими словами, это тип высшего рода, или, более точно, неприменённый конструктор типов « ». В теоретических моделях и языках с поддержкой каррирования, например в просто типизированном лямбда-исчислении, функциональный тип зависит ровно от двух типов: области определения и области значений . В этом случае функциональный тип, следуя математической традиции, обычно записывают как (в практических языках программирования — A -> B), или как , подразумевая, что существует ровно теоретико-множественных функций[en], отображающих на . С точки зрения соответствия Карри — Ховарда обитаемость функционального типа эквивалентна доказуемости логической импликации .

Функциональный тип можно рассматривать как частный случай зависимого произведения типов. Среди прочих свойств, такое представление несёт в себе идею полиморфной функции.

Языки программирования

В следующую таблицу сведён синтаксис, используемый в различных языках программирования для функциональных типов, а также соответствующие примеры сигнатуры типа для функции композиции функций.

Язык программированияНотацияПример сигнатуры типа[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», определимый далеко не во всех языках программирования.

См. также

Ссылки

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии