Функции первого класса: различия между версиями

[непроверенная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Нет описания правки
Метки: с мобильного устройства из мобильной версии
Нет описания правки
Строка 1:
В [[информатика|информатике]] [[язык программирования]] имеет '''функции первого класса''', если он рассматривает функции как [[Объект первого класса|объекты первого класса]]. В частности, это означает, что язык поддерживает передачу функций в качестве аргументов другим функциям, возврат их как результат других функций, присваивание их переменным или сохранение в структурах данных<ref>{{книга |заглавие=[[Структура и интерпретация компьютерных программ|Structure and Interpretation of Computer Programs]] |страницы=Section 1.3 [http://mitpress.mit.edu/sicp/full—text/book/book—Z—H—12.html#call_footnote_Temp_121 Formulating Abstractions with Higher—Order Procedures] |издательство=[[MIT Press]] |год=1984 |isbn=0-262-01077-1 |язык=en |автор={{Нп3|Harold[[Абельсон, AbelsonГарольд|Abelson, Harold|en|Harold Abelson}}]]; {{Нп3нп5|Gerald Jay Sussman|Sussman, Gerald Jay|en|Gerald Jay Sussman}}}}</ref>.
Некоторые теоретики языков программирования считают необходимым условием также поддержку [[Анонимные функции|анонимных функций]]<ref name="test">[http://www.worldcat.org/oclc/222529448 Programming language pragmatics], by Michael Lee Scott, section 11.2 «Functional Programming».</ref>.
В языках с функциями первого класса имена функций не имеют никакого специального статуса, они рассматриваются как обычные значения, тип которых является [[Функциональный тип|функциональным]]<ref>{{статья |заглавие=The Implementation of Lua 5.0 |ссылка=http://www.lua.org/doc/jucs05.pdf |язык=und |автор=Roberto Ierusalimschy; Luiz Henrique de Figueiredo; Waldemar Celes |издание= |archiveurl=https://web.archive.org/web/20170623052107/http://www.lua.org/doc/jucs05.pdf |archivedate=2017-06-23 }}</ref>.
Термин был впервые использован {{iwнп5|Стрэчи, Кристофер|Кристофером Стрэчи|en|Christopher Strachey}} в контексте «функции как объекты первого класса» в середине 1960-х<ref name="strachey">Rod Burstall, «Christopher Strachey—Understanding Programming Languages», ''[[Higher-Order and Symbolic Computation]]'' '''13''':52 (2000)</ref>.
 
Функции первого класса являются неотъемлемой частью [[Функциональное программирование|функционального программирования]], в котором использование [[Функция высшего порядка|функций высшего порядка]] является стандартной практикой. Простым примером функции высшего порядка будет функция ''[[Map (программирование)|Map]]'', которая принимает в качестве своих аргументов функцию и список и возвращает список после применения функции к каждому элементу списка. Чтобы язык программирования поддерживал ''Map'', он должен поддерживать передачу функций как аргумента.
 
Существуют некоторые сложности в реализации передачи функций как аргументов и возвращении их как результата, особенно в присутствии [[:en:non-local variable|нелокальных переменных]], введенныхвведённых во [[:en:Nested function|вложенных]] и [[Анонимная функция|анонимных функциях]]. Исторически они были названы [[Проблема фунарга|проблемами фунарга]], от английского «function argument»<ref>[[Joel Moses]]. [https://dspace.mit.edu/handle/1721.1/5854 «The Function of FUNCTION in LISP, or Why the FUNARG Problem Should be Called the Environment Problem»]. MIT AI Memo 199, 1970.</ref>.
В ранних императивных языках программирования эти проблемы обходились путём отказа от поддержки возвращения функций как результата или отказа от вложенных функций и следовательно нелокальных переменных (в частности, [[Си (язык программирования)|C]]). [[Lisp]], один из первых функциональных языков программирования, применяет подход [[:en:dynamicОбласть scopingвидимости#Лексические vs. динамические области видимости|динамической области видимости]], где нелокальные переменные возвращают ближайшее определение этих переменных к точке, в которой функция была вызвана, вместо точки, в которой она была объявлена. Полноценная поддержка для [[:en:lexical scoping|лексического контекста]] функций первого порядка была введена в [[Scheme]] и предполагает обработку ссылок на функции как [[Замыкание (программирование)|замыканий]] вместо чистых<ref name="strachey"/>, что, в свою очередь, делает необходимым применение [[Сборка мусора (программирование)|сборки мусора]].
 
== Концепции ==
Строка 14:
=== Функции высшего порядка: передача функции как аргумента ===
{{main|Функция высшего порядка}}
В языках, где функции — это объекты первого порядка, функции могут быть переданы как аргументы другим функциями так же, как и любые другие значения. Так, например, в [[Haskell]]:
<source lang="haskell">
map :: (a -> b) -> [a] -> [b]
Строка 37:
main = map (\x -> 3 * x + 1) [1, 2, 3, 4, 5]
</source>
В языках, не поддерживающих анонимных функций, необходимо сперва {{iwнп5|Привязка идентификатора|связать|en|Name binding}} функцию с именем:
<source lang="c">
int f(int x) {
Строка 87:
 
=== Функции высшего порядка: возврат функций как результата ===
При возврате функции на самом деле происходит возврат её замыкания. В примере на С все локальные переменные, заключенныезаключённые в замыкание, выйдут из [[Область видимости|области видимости]] как только функция, которая составляет замыкание, вернёт управление. Форсирование замыкания в дальнейшем может привести к неопределенномунеопределённому поведению.
 
== См. также ==