Sprzeciwiam się czemuś, co ciągle widzę w większości tych odpowiedzi, że funkcja powoduje, że funkcja zwraca wartość.
Funkcja to nie tylko stara metoda, która zwraca wartość. Nie tak: aby metoda była funkcją rzeczywistą, musi zwracać tę samą wartość, zawsze podając określone dane wejściowe. Przykładem metody, która nie jest funkcją, jest random
metoda w większości języków, ponieważ chociaż zwraca wartość, nie zawsze jest taka sama.
Funkcja jest zatem bardziej zbliżona do mapy (np. Gdzie x -> x'
dla funkcji jednowymiarowej). Jest to bardzo ważne rozróżnienie między zwykłymi metodami i funkcjami, ponieważ w przypadku funkcji rzeczywistych czas i kolejność ich oceny nie powinny mieć znaczenia, ponieważ nie zawsze tak jest w przypadku funkcji niefunkcjonalnych.
Oto kolejny przykład metody, która nie jest funkcją, ale w przeciwnym razie nadal zwróci wartość.
// The following is pseudo code:
g(x) = {
if (morning()) {
g = 2 * x;
}
else {
g = x;
}
return g;
}
Dalej sprzeciwiam się twierdzeniu, że procedury nie zwracają wartości. Procedura jest tylko specyficznym sposobem mówienia o funkcji lub metodzie. Oznacza to, że jeśli metoda podstawowa, którą twoja procedura definiuje lub implementuje, zwraca wartość, to zgadnij, co ta procedura zwraca wartość. Weźmy na przykład następujący fragment kodu 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))))))
Czy ostatnio słyszałeś o procedurach rekurencyjnych? Mówią o funkcji rekurencyjnej (funkcji rzeczywistej), która zwraca wartość i używają słowa „procedura”. Więc jaka jest różnica?
Cóż, innym sposobem myślenia o funkcji (oprócz znaczenia wspomnianego powyżej) jest abstrakcyjne przedstawienie ideału takiego jak cyfra 1. Procedura polega na tym, że rzeczywista implementacja tej rzeczy. Osobiście uważam, że są one wymienne.
(Uwaga: jeśli przeczytasz ten rozdział z linku, który podam, może się okazać, że trudniejszą koncepcją do zrozumienia nie jest różnica między funkcją a procedurą, ale proces i procedura. Czy wiesz, że procedura rekurencyjna może mieć proces iteracyjny?)
Analogiem do procedur są przepisy kulinarne. Na przykład; załóżmy, że masz maszynę o nazwie make-pies
ta maszyna pobiera składniki (fruit, milk, flower, eggs, sugar, heat)
i ta maszyna zwraca a pie
.
Może wyglądać reprezentacja tego komputera
make-pies (fruit, milk, flower, eggs, sugar, heat) = {
return (heat (add fruit (mix eggs flower milk)))
}
Oczywiście to nie jedyny sposób na zrobienie ciasta.
W tym przypadku możemy zobaczyć, że:
A function is to a machine
as a procedure is to a recipe
as attributes are to ingredients
as output is to product
Ta analogia jest OK, ale załamuje się, gdy weźmie się pod uwagę, że w przypadku programu komputerowego wszystko jest abstrakcją. Tak więc, inaczej niż w przypadku przepisu na maszynę, porównujemy dwie rzeczy, które same są abstrakcjami; dwie rzeczy, które równie dobrze mogą być tym samym. I uważam, że są (dla wszystkich celów i celów) to samo.