Функція вищого порядку
Функція вищого порядку — функція, що приймає як аргументи інші функції або повертає іншу функцію як результат. Основна ідея полягає в тому, що функції мають той же статус, що й інші об'єкти даних.
Наприклад, функція вищого порядку може бути використана для реалізації незмінної частини алгоритму, у той час як змінна частина має бути реалізована у функції, що передається аргументом. Типовим прикладом може бути функція сортування даних. Сортування даних потребує порівняння екземплярів даних, яке може бути різним для різних типів даних. Без використання функції вищого порядку було б необхідно створювати окрему функцію сортування для кожного типу даних. Але ж, зазвичай, сам алгоритм сортування не залежить від алгоритму порівняння й залежить лише від результату цього порівняння. Можливість вказати, як аргумент виклику, яку саме функцію порівняння треба використовувати для цього виклику, дає можливість створити універсальну функцію сортування. У той же час, та ж сама функція порівняння може бути використана як аргумент й для інших функцій вищого порядку, наприклад, для функцій пошуку максимального чи мінімального елементу.
Використання функцій вищого порядку призводить до абстрактних і компактних програм, беручи до уваги складність вироблених ними обчислень[1]. Іноді функції вищого порядку називають функторами хоча це не зовсім правильно, з математичної точки зору вони є функціоналами чи операторами.
У функціональних мовах програмування всі функції, що приймають декілька аргументів, є функціями вищого порядку, оскільки вони є каррінгованими, що дає можливість наче частково виконати функцію, в результаті чого отримати нову функцію вже від меншого числа аргументів.
Приклад
Наступний код містить функцію вищого порядку square()
, яка як перший аргументу приймає функцію. У результаті на екран буде виведено «100» (результат обчислення (7 +3) × (7 +3)).
Python
def square(function, x):
return function(x) * function(x)
def f(x):
return x + 3
print square(f, 7)
F#
let square func x = (func x) * (func x)
let f x = x + 3
square f 7
JavaScript
let square = (func, x) => func(x) * func(x);
console.log(square(x => x + 3, 7));
Альтернативи
- Вказівник на функцію
- Макрос
- Динамічне виконання коду
- Вкладена функція
- Шаблонний метод в ООП
Примітки
- А. Філд, П. Харрісон, Функціональне програмування, Стор. 55 [Розділ 3: Функції вищого порядку].
Джерела
- А. Філд, П. Харрісон Функціональне програмування: Пер. з англ. - М.: Мир, 1993. - 637 с, іл. ISBN 5-03-001870-0.