มันคืออะไรในการเขียนโปรแกรมฟังก์ชั่นที่สร้างความแตกต่าง?
ฟังก์ชั่นการเขียนโปรแกรมโดยหลักการ ที่เปิดเผย คุณพูดในสิ่งที่ผลลัพธ์ของคุณแทนที่จะเป็นวิธีการคำนวณ
ลองมาดูตัวอย่างการใช้งานจริง ๆ ในการใช้งานของคุณ ใน Haskell มันจะเป็น:
predsum pred numbers = sum (filter pred numbers)
มันชัดเจน หรือไม่ว่าผลลัพธ์คืออะไร ค่อนข้างจะเป็นผลรวมของตัวเลขที่ตรงกับภาคแสดง วิธีการก็คือการคำนวณ? ฉันไม่สนใจถามผู้แปล
คุณอาจบอกได้ว่าการใช้sum
และfilter
เป็นกลอุบายและไม่นับ ให้นำไปใช้โดยไม่ต้องมีผู้ช่วยเหลือเหล่านี้ (แม้ว่าวิธีที่ดีที่สุดคือการใช้พวกมันก่อน)
วิธีแก้ปัญหา "ฟังก์ชั่นการเขียนโปรแกรม 101" ที่ไม่ได้ใช้งานsum
คือการเรียกซ้ำ:
sum pred list =
case list of
[] -> 0
h:t -> if pred h then h + sum pred t
else sum pred t
มันยังค่อนข้างชัดเจนว่าผลลัพธ์ในแง่ของการเรียกใช้ฟังก์ชันเดียวคืออะไร มันเป็นอย่างใดอย่างหนึ่ง0
หรือขึ้นอยู่กับrecursive call + h or 0
pred h
ยังคง straighforward สวยแม้ว่าผลลัพธ์ที่ได้คือไม่ชัดเจนทันที (แม้ว่าจะมีนิด ๆ หน่อย ๆ ของการปฏิบัตินี้จริงๆอ่านเช่นเดียวกับfor
วง)
เปรียบเทียบกับรุ่นของคุณ:
public int Sum(Func<int,bool> predicate, IEnumerable<int> numbers){
int result = 0;
foreach(var item in numbers)
if (predicate(item)) result += item;
return result;
}
ผลลัพธ์คืออะไร โอ้ฉันเข้าใจแล้ว: โสดreturn
return result
คำสั่งไม่น่าประหลาดใจที่นี่:
แต่สิ่งที่เป็นresult
?int result = 0
? ดูไม่ถูกต้อง 0
คุณทำบางสิ่งบางอย่างในภายหลังด้วยที่ ตกลงคุณเพิ่มitem
ของมัน และอื่น ๆ
แน่นอนว่าสำหรับโปรแกรมเมอร์ส่วนใหญ่แล้วมันค่อนข้างชัดเจนว่าเกิดอะไรขึ้นใน funciton ง่าย ๆ แบบนี้ แต่เพิ่มreturn
ข้อความพิเศษหรือมากกว่านั้นและมันก็ยากที่จะติดตาม รหัสทั้งหมดเกี่ยวกับวิธีการและสิ่งที่เหลือสำหรับผู้อ่านที่จะคิดออก -นี้เป็นที่ชัดเจนสไตล์ความจำเป็นมาก
ดังนั้นตัวแปรและลูปผิดหรือเปล่า?
เลขที่
มีหลายสิ่งหลายอย่างที่อธิบายได้ง่ายกว่าพวกเขาและอัลกอริธึมหลายอย่างที่ต้องใช้สถานะที่เปลี่ยนแปลงได้นั้นรวดเร็ว แต่ตัวแปรมีความจำเป็นโดยเนื้อแท้อธิบายว่าแทนที่จะเป็นอะไรและให้การคาดการณ์เล็กน้อยว่าค่าของพวกเขาอาจเป็นไม่กี่บรรทัดในภายหลังหรือหลังจากการวนซ้ำซ้ำสองสามครั้ง โดยทั่วไปแล้วลูปต้องการสถานะที่จะทำให้เข้าใจได้และดังนั้นจึงจำเป็นอย่างยิ่งเช่นกัน
ตัวแปรและลูปไม่ใช่การเขียนโปรแกรมที่ใช้งานได้
สรุป
การเขียนโปรแกรม funcitonal ร่วมสมัยเป็นรูปแบบและวิธีคิดที่มีประโยชน์มากกว่ากระบวนทัศน์ การตั้งค่าที่แข็งแกร่งสำหรับฟังก์ชั่นบริสุทธิ์อยู่ในความคิดนี้ แต่มันเป็นเพียงส่วนเล็ก ๆ
ภาษาที่แพร่หลายส่วนใหญ่อนุญาตให้คุณใช้โครงสร้างที่ใช้งานได้บางอย่าง ตัวอย่างเช่นใน Python คุณสามารถเลือกระหว่าง:
result = 0
for num in numbers:
if pred(result):
result += num
return result
หรือ
return sum(filter(pred, numbers))
หรือ
return sum(n for n in numbers if pred(n))
นิพจน์การทำงานเหล่านี้เหมาะสมอย่างยิ่งสำหรับปัญหาประเภทนั้นและทำให้โค้ดสั้นลง (และสั้นลงก็ดี ) คุณไม่ควรแทนที่รหัสที่จำเป็นด้วยความคิดโดยไม่ตั้งใจ แต่เมื่อมันเข้ากันแล้วพวกมันก็เป็นตัวเลือกที่ดีกว่า
item
ตัวแปรกลายพันธุ์ในลูป