Функции первого класса: различия между версиями
[непроверенная версия] | [отпатрулированная версия] |
Содержимое удалено Содержимое добавлено
Нет описания правки Метки: с мобильного устройства из мобильной версии |
MagnusFit (обсуждение | вклад) Нет описания правки |
||
Строка 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 |автор=
Некоторые теоретики языков программирования считают необходимым условием также поддержку [[Анонимные функции|анонимных функций]]<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>.
Термин был впервые использован {{
Функции первого класса являются неотъемлемой частью [[Функциональное программирование|функционального программирования]], в котором использование [[Функция высшего порядка|функций высшего порядка]] является стандартной практикой. Простым примером функции высшего порядка будет функция ''[[Map (программирование)|Map]]'', которая принимает в качестве своих аргументов функцию и список и возвращает список после применения функции к каждому элементу списка. Чтобы язык программирования поддерживал ''Map'', он должен поддерживать передачу функций как аргумента.
Существуют некоторые сложности в реализации передачи функций как аргументов и возвращении их как результата, особенно в присутствии [[:en:non-local variable|нелокальных переменных]],
В ранних императивных языках программирования эти проблемы обходились путём отказа от поддержки возвращения функций как результата или отказа от вложенных функций и следовательно нелокальных переменных (в частности, [[Си (язык программирования)|C]]). [[Lisp]], один из первых функциональных языков программирования, применяет подход [[
== Концепции ==
Строка 14:
=== Функции высшего порядка: передача функции как аргумента ===
{{main|Функция высшего порядка}}
В языках, где функции — это объекты первого порядка, функции могут быть переданы как аргументы другим функциями так же, как и любые другие значения. Так, например, в [[Haskell]]:
<source lang="haskell">
map :: (a -> b) -> [a] -> [b]
Строка 37:
main = map (\x -> 3 * x + 1) [1, 2, 3, 4, 5]
</source>
В языках, не поддерживающих анонимных функций, необходимо сперва {{
<source lang="c">
int f(int x) {
Строка 87:
=== Функции высшего порядка: возврат функций как результата ===
При возврате функции на самом деле происходит возврат её замыкания. В примере на С все локальные переменные,
== См. также ==
|