Введение

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

В математике и информатике функция высшего порядка (HOF) – это функция, которая выполняет хотя бы одно из следующих действий: принимает одну или несколько функций в качестве аргументов (то есть процедурный параметр, который является параметром процедуры, являющейся самой по себе процедурой), или возвращает функцию в качестве результата. Все остальные функции являются функциями первого порядка. В математике функции высшего порядка также называют операторами или функционалами. Дифференциальный оператор в математическом анализе является распространенным примером, поскольку он отображает функцию в её производную, которая также является функцией. Функции высшего порядка не следует путать с другими значениями слова "функтор" в математике, см. Функтор (значения). В нетипизированном лямбда-исчислении все функции являются функциями высшего порядка; в типизированном лямбда-исчислении, от которого происходят большинство функциональных языков программирования, функции высшего порядка, принимающие одну функцию в качестве аргумента, являются значениями типов вида .

Макрофайлы

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

Динамическая оценка кода

В других императивных языках программирования можно достичь некоторых тех же алгоритмических результатов, что и при использовании функций высшего порядка, посредством динамического выполнения кода (иногда называемого операциями Eval или Execute) в области вычисления. Этот подход может иметь существенные недостатки: код, передаваемый для выполнения, как правило, не имеет статической типизации; эти языки обычно полагаются на динамическую типизацию для определения корректности и безопасности выполняемого кода. Аргумент обычно предоставляется в виде строки, значение которой может быть неизвестно до момента выполнения. Эта строка должна либо компилироваться во время выполнения программы (с использованием JIT-компиляции), либо вычисляться посредством интерпретации, что приводит к дополнительным накладным расходам во время выполнения и обычно генерирует менее эффективный код.