Будь-яка різниця між функцією першого класу і функцією високого замовлення


129

Мені цікаво, чи / яка різниця між функцією першого класу і функцією високого замовлення .

Я прочитав ці дві сторінки вікі, і вони виглядають досить схоже. Якщо вони говорять про те саме, навіщо потрібні дві термінології?

Спробував google, але не знайшов корисної речі.

Відповіді:


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.