Любая разница между функцией первого класса и функцией высокого порядка
Мне интересно, есть ли разница между функцией первого класса и функцией высокого порядка?
Я прочитал эти две вики-страницы, и они выглядят довольно похоже. Если они говорят об одном и том же, зачем нужны две терминологии?
Пробовал гуглить но не нашел ничего полезного.
9 ответов
Есть разница. Когда вы говорите, что у языка есть функции первого класса, это означает, что язык обрабатывает функции как значения - что вы можете назначить функцию в переменную, передать ее и т. Д. Функции высшего порядка - это функции, которые работают с другими функциями, то есть что они принимают одну или несколько функций в качестве аргумента, а также могут возвращать функцию.
Концепция "высшего порядка" может применяться к функциям в целом, например, к функциям в математическом смысле. Концепция "первого класса" имеет отношение только к функциям в языках программирования. Он редко используется при обращении к функции, такой как "первоклассная функция". Гораздо чаще говорят, что "язык имеет / не имеет первоклассную поддержку функций".
Эти две вещи тесно связаны, так как трудно представить язык с функциями первого класса, который бы не поддерживал функции более высокого порядка, и наоборот, язык с функциями высшего порядка, но без поддержки функций первого класса.
Функции первого класса - это функции, которые обрабатываются как объект (или могут быть присвоены переменной).
Функции высшего порядка - это функции, которые принимают в качестве параметра хотя бы одну функцию первого класса.
Они разные.
Функции первого класса
Значения в языке, которые обрабатываются единообразно, называются "первым классом". Они могут храниться в структурах данных, передаваться в качестве аргументов или использоваться в управляющих структурах.
Можно сказать, что языки, которые поддерживают значения с типами функций и обрабатывают их так же, как нефункциональные значения, имеют "функции первого класса".
Функции высшего порядка
Одним из последствий наличия функций первого класса является то, что вы должны иметь возможность передавать функцию в качестве аргумента другой функции. Последняя функция теперь "высшего порядка". Это функция, которая принимает функцию в качестве аргумента.
Канонический пример - "карта"
map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs
То есть он принимает функцию и массив и возвращает новый массив с функцией, примененной к каждому элементу.
Функциональные языки - языки, где функции являются основным средством построения программ - все имеют функции первого класса. Большинство также имеют функции более высокого порядка (очень редкими исключениями являются такие языки, как Excel, которые можно назвать функциональными, но не более высокого порядка).
В дополнение к предыдущим ответам, обратите внимание, что язык с первоклассными функциями автоматически разрешает выражение функций более высокого порядка (потому что вы можете передавать функции в качестве параметров, как любое другое значение).
С другой стороны, вы можете представить языки, которые поддерживают функции высшего порядка, но не делают функции первоклассными (и где параметры, которые являются функциями, обрабатываются специально и отличаются от "обычных" параметров значений).
Таким образом, наличие первоклассных функций (как языковой признак) подразумевает наличие функций более высокого порядка, но не наоборот.
Функциипервого класса могут:
- Храниться в переменных
- Вернитесь из функции.
- Передавайте в качестве аргументов в другую функцию.
Функция высокого порядка - это функция, которая возвращает другую функцию.
Например:
function highOrderFunc() {
return function () {
alert('hello');
};
}
Функция первого класса:
Когда мы передаем функцию в качестве аргумента другой функции, называемой функцией первого класса. Возможность использовать функцию как значение, известную как функция первого класса.
var a = function(parameter){
return function(){
}
}
console.log(a())
Функция высшего порядка:
Функция, которая принимает другую функцию в качестве аргумента или возвращает новую функцию, или и то, и другое, называется функциями высшего порядка. Функции высшего порядка возможны только благодаря функции первого класса.
Функции первого класса означают все, что вы можете делать с другими типами (переменные, логические значения, числа...), вы можете делать это с функциями.
Например, присвойте их переменным, раздайте, создайте на лету.
Функция первого класса — это общий термин.
Функция высокого порядка — это разновидность функции первого класса, подвид функции первого класса.
Функция высокого порядка — это функция, которая возвращает функцию или принимает другие функции в качестве аргументов.
Пример функции высокого порядка:
Но в то же время мы можем назвать эту функцию как функцию первого класса. Только ответ будет не таким четким, как если бы вы сказали Функция высшего порядка, потому что это более конкретный термин.
function sayHello() {
return () => {
console.log("Hello!");
};
}
Простыми словами, есть бренд Bentley, это общий термин.
У Bentley есть модели:
- Continental (это Bentley, просто более конкретный термин)
- Flying Spur (это Bentley, просто более конкретный термин)
- Bentayga (это Bentley, просто более конкретный термин)
Функция первого класса — это функция, которая рассматривается как переменная.Кроме того, их можно использовать в качестве аргументов для других функций. Функция в JavaScript считается гражданином первого класса. Следовательно, функции также являются объектами просто потому, что они являются значениями.
Как и в JavaScript, функции считаются значениями или объектами.
const Person = {
dance:(name) => {
return `${name} can dance`
},
walk:(name) => {
return `I am sure ${name} can walk `
},
}
console.log(Person.dance("John"));
console.log(Person.walk("John"));
В функциях более высокого порядка другие функции принимаются в качестве аргументов (обратных вызовов) или возвращаются в качестве результатов.
Эта концепция широко используется в JavaScript.
К функциям высшего порядка относятся:
- карта
- Сортировать
- фильтр
- пример карты-
без высшего порядка
const numbers = [1, 2, 3, 4, 5];
function addOneMore(array, newArr = []) {
for (let i = 0; i < array.length; i++) {
newArr.push(array[i] + 1);
}
return newArr;
}
const outputData = addOneMore(numbers);
console.log(outputData);
с функцией высокого порядка, map()
const numbers = [1, 2, 3, 4, 5];
const outputData = numbers.map((number) => number + 1);
console.log(outputData);