ฉันคัดค้านสิ่งที่ฉันเห็นอยู่เรื่อย ๆ ในคำตอบเหล่านี้ส่วนใหญ่สิ่งที่ทำให้ฟังก์ชั่นฟังก์ชั่นคือว่ามันส่งกลับค่า
ฟังก์ชั่นไม่ได้เป็นเพียงวิธีการเก่า ๆ ที่ส่งกลับค่า ไม่ใช่: เพื่อให้เมธอดเป็นฟังก์ชั่นจริงมันจะต้องคืนค่าเดิมที่ได้รับจากอินพุตที่ระบุเสมอ ตัวอย่างของวิธีการที่ไม่ใช่ฟังก์ชั่นเป็น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
การเปรียบเทียบนั้นก็โอเค แต่เมื่อคุณคำนึงถึงว่าเมื่อคุณกำลังจัดการกับโปรแกรมคอมพิวเตอร์ทุกอย่างก็เป็นนามธรรม ซึ่งแตกต่างจากในกรณีของสูตรอาหารกับเครื่องจักรเรากำลังเปรียบเทียบสองสิ่งที่เป็นนามธรรม สองสิ่งที่อาจเหมือนกัน และฉันถือว่าพวกเขา (สำหรับทุกเจตนาและวัตถุประสงค์) ในสิ่งเดียวกัน