Введение
Функция, которая принимает одну или несколько функций в качестве входных данных или возвращает функцию.
В математике и информатике функция высшего порядка (HOF) – это функция, которая выполняет хотя бы одно из следующих действий: принимает одну или несколько функций в качестве аргументов (то есть процедурный параметр, который является параметром процедуры, являющейся самой по себе процедурой), или возвращает функцию в качестве результата. Все остальные функции являются функциями первого порядка. В математике функции высшего порядка также называют операторами или функционалами. Дифференциальный оператор в математическом анализе является распространенным примером, поскольку он отображает функцию в её производную, которая также является функцией. Функции высшего порядка не следует путать с другими значениями слова "функтор" в математике, см. Функтор (значения). В нетипизированном лямбда-исчислении все функции являются функциями высшего порядка; в типизированном лямбда-исчислении, от которого происходят большинство функциональных языков программирования, функции высшего порядка, принимающие одну функцию в качестве аргумента, являются значениями типов вида .
takes one or more functions as arguments (i. e. a procedural parameter, which is a parameter of a procedure that is itself a procedure),
returns a function as its result. All other functions are first order functions. In mathematics higher order functions are also termed operators or functionals. The differential operator in calculus is a common example, since it maps a function to its derivative, also a function. Higher order functions should not be confused with other uses of the word "functor" throughout mathematics, see Functor (disambiguation). In the untyped lambda calculus, all functions are higher order; in a typed lambda calculus, from which most functional programming languages are derived, higher order functions that take one function as argument are values with types of the form .
Макрофайлы
Макросы также могут использоваться для реализации некоторых эффектов функций высшего порядка. Однако макросы сложно защитить от захвата переменных, и они могут приводить к генерации большого количества дублированного кода, что затрудняет его оптимизацию компилятором. Макросы обычно не имеют строгой типизации, хотя могут генерировать код со строгой типизацией.
Динамическая оценка кода
В других императивных языках программирования можно достичь некоторых тех же алгоритмических результатов, что и при использовании функций высшего порядка, посредством динамического выполнения кода (иногда называемого операциями Eval или Execute) в области вычисления. Этот подход может иметь существенные недостатки: код, передаваемый для выполнения, как правило, не имеет статической типизации; эти языки обычно полагаются на динамическую типизацию для определения корректности и безопасности выполняемого кода. Аргумент обычно предоставляется в виде строки, значение которой может быть неизвестно до момента выполнения. Эта строка должна либо компилироваться во время выполнения программы (с использованием JIT-компиляции), либо вычисляться посредством интерпретации, что приводит к дополнительным накладным расходам во время выполнения и обычно генерирует менее эффективный код.
The argument code to be executed is usually not statically typed; these languages generally rely on dynamic typing to determine the well formedness and safety of the code to be executed. The argument is usually provided as a string, the value of which may not be known until run time. This string must either be compiled during program execution (using just in time compilation) or evaluated by interpretation, causing some added overhead at run time, and usually generating less efficient code.