Я заперечую проти чогось, що я бачу знову і знову в більшості цих відповідей, що те, що робить функцію функцією, це те, що вона повертає значення.
Функція - це не будь-який старий метод, який повертає значення. Не так: для того, щоб метод був реальною функцією, він повинен повертати одне і те ж значення завжди з певним входом. Прикладом методу, який не є функцією, є random
метод більшості мов, оскільки, хоча він повертає значення, значення не завжди є однаковим.
Отже, функція більше схожа на карту (наприклад, де x -> x'
для одновимірної функції). Це дуже важлива відмінність між звичайними методами та функціями, оскільки при роботі з реальними функціями терміни та порядок їх оцінювання ніколи не мають значення, де це не завжди відбувається з нефункціональними функціями.
Ось ще один приклад методу, який не є функцією, але в іншому випадку все одно поверне значення.
// The following is pseudo code:
g(x) = {
if (morning()) {
g = 2 * x;
}
else {
g = x;
}
return g;
}
Далі я заперечую проти того, що процедури не повертають значення. Процедура - це лише специфічний спосіб розмови про функцію чи метод. Тож це означає, що якщо основний метод, який ваша процедура визначає або реалізує, повертає значення, то вгадайте, що ця процедура повертає значення. Візьмемо для прикладу наступний фрагмент з SICP :
// We can immediately translate this definition into a recursive procedure
// for computing Fibonacci numbers:
(define (fib n)
(cond ((= n 0) 0)
((= n 1) 1)
(else (+ (fib (- n 1))
(fib (- n 2))))))
Чи чули ви про рекурсивні процедури набагато останнім часом? Вони говорять про рекурсивну функцію (справжню функцію) і вона повертає значення, і вони використовують слово "процедура". То яка різниця тоді?
Ну і інший спосіб мислення функції (крім значення, згаданого вище) - це абстрактне зображення ідеалу, як цифра 1. Процедура - це фактичне втілення цієї речі. Я особисто вважаю, що вони взаємозамінні.
(Зверніть увагу, якщо ви читаєте цю главу із посилання, яке я надаю, ви можете виявити, що складніше поняття - це не різниця між функцією та процедурою, а процес і процедура. Чи знаєте ви, що рекурсивна процедура може мати ітераційний процес?)
Аналогом процедур є рецепти. Наприклад; припустимо, у вас є машина, звана make-pies
ця машина, містить інгредієнти, (fruit, milk, flower, eggs, sugar, heat)
і ця машина повертає pie
.
Представлення цієї машини може виглядати так
make-pies (fruit, milk, flower, eggs, sugar, heat) = {
return (heat (add fruit (mix eggs flower milk)))
}
Звичайно, це не єдиний спосіб приготувати пиріг.
У цьому випадку ми можемо побачити, що:
A function is to a machine
as a procedure is to a recipe
as attributes are to ingredients
as output is to product
Ця аналогія нормальна, але вона руйнується, якщо врахувати, що, коли ти маєш справу з комп'ютерною програмою, все це абстракція. Отже, на відміну від рецепту до машини, ми порівнюємо дві речі, які самі по собі є абстракціями; дві речі, які можуть бути однаковими. І я вважаю, що вони (для всіх намірів і цілей) одне і те ж.