Любая разница между функцией первого класса и функцией высокого порядка

Мне интересно, есть ли разница между функция первого класса и Функция высокого порядка.

Я читаю эти две страницы вики, и они выглядят довольно схожими. Если они говорят о том же, зачем нужны две терминологии?

Попробовал Google, но не нашел ничего полезного.

Ответ 1

Есть разница. Когда вы говорите, что язык имеет первоклассные функции, это означает, что язык рассматривает функции как значения - вы можете назначить функцию в переменную, передать ее и т.д. Функции более высокого порядка - это функции, которые работают с другими функциями, что означает что они берут одну или несколько функций в качестве аргумента и могут также возвращать функцию.

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

Две вещи тесно связаны друг с другом, поскольку трудно представить язык с первоклассными функциями, которые также не будут поддерживать функции более высокого порядка и, наоборот, язык с функциями более высокого порядка, но без поддержки функций первого класса.

Ответ 2

Функции первого класса - это функции, которые обрабатываются как объект (или присваиваются переменной).

Функции более высокого порядка - это функции, которые принимают как минимум одну функцию первого класса в качестве параметра.

Ответ 3

Они разные.

Функции первого класса

Значения на языке, которые обрабатываются одинаково повсеместно, называются "первый класс". Они могут храниться в структурах данных, передаваться в качестве аргументов или использоваться в структурах управления.

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

Функции более высокого порядка

Одним из последствий наличия функций первого класса является то, что вы должны иметь возможность передать функцию в качестве аргумента другой функции. Последняя функция теперь является "более высоким порядком". Это функция, которая принимает функцию в качестве аргумента.

Канонический пример - это "карта"

map :: (a -> b) -> [a] -> [b]
map f []     = []
map f (x:xs) = f x : map f xs

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

Функциональные языки - языки, где функции являются основным средством построения программ - все имеют функции первого класса. Большинство из них также имеют функции более высокого порядка (очень редкие исключения - такие языки, как Excel, которые можно назвать функциональными, но не более высокими). ​​

Ответ 4

В дополнение к предыдущим ответам обратите внимание, что язык с первоклассными функциями автоматически включает выражение функций более высокого порядка (потому что вы можете передавать функции как параметры, как любое другое значение).

С другой стороны, вы можете представить себе языки, которые поддерживают функции более высокого порядка, но не делают функции первоклассными (и где параметры, которые являются функциями, обрабатываются специально и отличаются от "обычных" параметров значения).

Таким образом, наличие первоклассных функций (как языковой функции) подразумевает наличие функций более высокого порядка, но не наоборот.