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


129

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

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

Пытался погуглить но ничего полезного не нашел.

Ответы:


154

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

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

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


2
Я думаю, что меня легко сбить с толку то, что они тесно связаны.
Саймон

63
@Simon Я думаю, что ключ к недопущению путаницы - это помнить, что у языка либо есть первоклассные функции (вы также можете говорить о «первоклассных» других вещах, таких как первоклассные классы и т. Д.), Либо нет. Таким образом, вы никогда не говорите о том, является ли конкретная функция первоклассной или нет. OTOH, когда вы говорите, что функция является функцией высшего порядка или нет, это просто говорит о том, работает ли она с функциями, поэтому «высший порядок» является свойством каждой отдельной функции. Таким образом, «имеет функции первого класса» - это свойство языка, а «имеет функции высшего порядка» - свойство функции.
Бен

Именно Бен. Я думал, что оба эти свойства - свойство функции, поэтому я был сбит с толку. Спасибо за ваши комментарии.
Саймон

Также хорошо иметь в виду, что «первоклассные функции» НЕ то же самое, что и поддержка замыкания. Например, в C поддерживаются «функции первого класса» через указатели функций. Однако C не поддерживает никаких понятий вложенных функций и, следовательно, не поддерживает замыкания.
Tac-Tics

1
@ Tac-Tics определения, безусловно, субъективны и открыты для обсуждения, но я лично предпочитаю думать, что C поддерживает только функции более высокого порядка (через указатели функций). Однако функции первого класса не поддерживаются, потому что функции уступают другим типам значений, таким как intили char, в том смысле, что они не могут быть явно определены (телом функции) в любом месте.
wlnirvana

67

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

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


20

Они разные.

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

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

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

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

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

Канонический пример - «карта».

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

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

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


1
Спасибо, Дон. Он всеобъемлющий. И я думаю, что фаза «Одно из последствий» указывает на некую связь между этими двумя.
Саймон

10

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

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

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


Не могли бы вы привести пример, в котором функция высшего порядка не является функцией первого класса. (Я думал, что оба они одинаковые.)
СЕЙЧАС

@ATHER, у меня нет конкретного примера языка, который сделал бы такой выбор дизайна для функций как таковых. Но нечто подобное происходит, например, с шаблонами в C ++: шаблоны имеют более высокий порядок (вы можете иметь «параметры шаблона шаблона»), но не значения первого класса, т.е. шаблоны не могут быть параметрами для обычных функций. Аналогично, например, с модулями / функторами в ML.
Андреас Россберг

@AndreasRossberg Разве Java 8 не будет правильным ответом на его вопрос? Функции не являются первоклассными гражданами, но методы Java могут получать функции (через функциональные интерфейсы), как вы описываете как «параметры, которые являются функциями, обрабатываются особым образом и отличаются от« обычных »параметров значений».
Абдул

1

Функции Первого класса могут:

  • Храниться в переменных
  • Быть возвращенным из функции.
  • Передаются как аргументы в другую функцию.

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

Например:

function highOrderFunc() {
  return function () {
    alert('hello');
  };
}

0

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

Например, назначьте их переменным, передайте, создавайте на лету.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.