Bu cevapların çoğunda sürekli olarak görmeye devam ettiğim bir şeyle itiraz ediyorum, bir işlevi bir işlev yapan şeyin bir değer döndürmesidir.
Bir işlev yalnızca bir değer döndüren eski bir yöntem değildir. Öyle değil: Bir yöntemin gerçek bir işlev olması için, her zaman belirli bir girdi verildiğinde aynı değeri döndürmesi gerekir. İşlev olmayan bir yönteme örnek olarakrandom
çoğu dilde yöntemdir, çünkü bir değer döndürmesine rağmen değer her zaman aynı değildir.
Bu nedenle bir işlev bir haritaya daha yakındır (örneğin, x -> x'
tek boyutlu bir işlev için nerede ). Bu, normal yöntemler ve işlevler arasında çok önemli bir ayrımdır, çünkü gerçek işlevlerle uğraşırken zamanlama ve değerlendirilme sırası hiçbir zaman önemli değildir, çünkü bu her zaman işlevsiz durumlarda böyle değildir.
Burada, işlev olmayan ancak yine de bir değer döndürecek bir yöntemin başka bir örneği verilmiştir.
// The following is pseudo code:
g(x) = {
if (morning()) {
g = 2 * x;
}
else {
g = x;
}
return g;
}
Ayrıca prosedürlerin değerleri döndürmediği fikrine itiraz ediyorum. Yordam yalnızca bir işlev veya yöntem hakkında konuşmanın özel bir yoludur. Bu, prosedürünüzün tanımladığı veya uyguladığı temel yöntem bir değer döndürüyorsa, o prosedürün bir değer döndürdüğünü tahmin edin. Örneğin, SICP'den aşağıdaki kod parçacığını ele alalım :
// 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))))))
Son zamanlarda tekrarlayan prosedürleri duydunuz mu? Özyinelemeli bir işlevden (gerçek bir işlev) bahsediyorlar ve bir değer döndürüyorlar ve "yordam" sözcüğünü kullanıyorlar. Peki fark ne?
Bir işlevi (yukarıda belirtilen anlamın yanı sıra) düşünmenin başka bir yolu, 1 rakamı gibi bir idealin soyut bir temsilidir. Bir prosedür, o şeyin gerçek uygulamasıdır. Ben şahsen değiştirilebilir olduklarını düşünüyorum.
(Not: Eğer sağladığım bağlantıdan o bölümü okursanız, kavramak için daha zor bir kavramın bir işlev ve bir prosedür değil, bir süreç ve bir prosedür arasındaki fark olduğunu görebilirsiniz. Özyinelemeli bir prosedürün yinelemeli süreç?)
Prosedürler için bir analog tariflerdir. Örneğin; adlı bir makine olduğunu varsayalım make-pies
bu makine malzemelerle alır (fruit, milk, flower, eggs, sugar, heat)
ve bu makine bir döner pie
.
Bu makinenin bir temsili
make-pies (fruit, milk, flower, eggs, sugar, heat) = {
return (heat (add fruit (mix eggs flower milk)))
}
Tabii ki turta yapmanın tek yolu bu değil.
Bu durumda şunu görebiliriz:
A function is to a machine
as a procedure is to a recipe
as attributes are to ingredients
as output is to product
Bu benzetme tamam ama bir bilgisayar programı ile uğraşırken her şeyin bir soyutlama olduğunu dikkate aldığınızda bozulur. Yani bir makinenin tarifinden farklı olarak, soyutlama olan iki şeyi karşılaştırıyoruz; aynı şey olabilecek iki şey. Ve onların (her niyet ve amaç için) aynı şey olduklarına inanıyorum.