ประโยชน์ของการเขียนโปรแกรมเชิงฟังก์ชันคืออะไร? [ปิด]


97

คุณคิดว่าประโยชน์ของการเขียนโปรแกรมเชิงฟังก์ชันคืออะไร? แล้วสมัยนี้สมัครโปรแกรมเมอร์กันยังไง?

อะไรคือความแตกต่างที่ยิ่งใหญ่ที่สุดระหว่างการเขียนโปรแกรมเชิงฟังก์ชันและ OOP



คำตอบ:


75

รูปแบบของการเขียนโปรแกรมเชิงฟังก์ชันคือการอธิบายสิ่งที่คุณต้องการแทนที่จะได้รับ เช่น: แทนที่จะสร้าง for-loop ด้วยตัวแปรวนซ้ำและเดินผ่านอาร์เรย์ที่ทำบางสิ่งบางอย่างกับแต่ละเซลล์คุณจะบอกว่าสิ่งที่เทียบเท่ากับ "ป้ายกำกับนี้หมายถึงเวอร์ชันของอาร์เรย์นี้ซึ่งมีการใช้ฟังก์ชันนี้กับทุกเซลล์ องค์ประกอบ "

การเขียนโปรแกรมเชิงฟังก์ชันจะย้ายแนวคิดการเขียนโปรแกรมขั้นพื้นฐานไปยังคอมไพเลอร์แนวคิดต่างๆเช่นการทำความเข้าใจรายการและการแคช

ประโยชน์ที่ใหญ่ที่สุดของการเขียนโปรแกรมเชิงฟังก์ชันคือความกะทัดรัดเนื่องจากโค้ดสามารถกระชับได้มากขึ้น โปรแกรมที่ใช้งานได้ไม่ได้สร้างตัวแปรตัววนซ้ำเพื่อเป็นศูนย์กลางของลูปดังนั้นสิ่งนี้และค่าใช้จ่ายประเภทอื่น ๆ จะถูกตัดออกจากโค้ดของคุณ

ประโยชน์หลักอื่น ๆ คือการทำงานพร้อมกันซึ่งทำได้ง่ายกว่าด้วยการเขียนโปรแกรมเชิงฟังก์ชันเนื่องจากคอมไพเลอร์ดูแลการดำเนินการส่วนใหญ่ซึ่งเคยต้องการการตั้งค่าตัวแปรสถานะด้วยตนเอง (เช่นตัววนซ้ำในลูป)

ประโยชน์ด้านประสิทธิภาพบางประการสามารถเห็นได้ในบริบทของโปรเซสเซอร์ตัวเดียวเช่นกันขึ้นอยู่กับวิธีการเขียนโปรแกรมเนื่องจากภาษาและส่วนขยายที่ใช้งานได้ส่วนใหญ่สนับสนุนการประเมินที่ขี้เกียจ ใน Haskell คุณสามารถพูดว่า "ป้ายกำกับนี้แทนอาร์เรย์ที่มีเลขคู่ทั้งหมด" อาร์เรย์ดังกล่าวมีขนาดใหญ่ไม่สิ้นสุด แต่คุณสามารถขอองค์ประกอบที่ 100,000 ของอาร์เรย์นั้นได้ตลอดเวลาโดยไม่ต้องรู้ว่าในเวลาเริ่มต้นอาร์เรย์ - ค่าใดที่คุณต้องการมากที่สุด ค่าจะถูกคำนวณเมื่อคุณต้องการเท่านั้นและจะไม่มีการคำนวณเพิ่มเติม


13
ฉันรู้สึกว่าย่อหน้าแรกของคุณใกล้เคียงกับการอธิบายการเขียนโปรแกรมเชิงสัมพันธ์เชิงประกาศเช่น Prolog มากกว่าการเขียนโปรแกรมเชิงฟังก์ชัน
McPherrinM

6
@McPherrinM: ภาษาที่ใช้งานได้มีการประกาศแทนที่จะเป็นความจำเป็น
Lie Ryan

2
ดูเหมือนว่าคุณกำลังสับสนกับ DP IP กับ FP FP จัดเตรียมไว้สำหรับการแยกข้อกังวลโดยเน้นองค์ประกอบของฟังก์ชันกล่าวคือการแยกการอ้างอิงระหว่างการคำนวณย่อยของการคำนวณเชิงกำหนด
Shelby Moore III

2
@LieRyan ไม่ถูกต้อง โปรดดูลิงก์ในความคิดเห็นก่อนหน้าของฉัน
Shelby Moore III

ภาวะพร้อมกันคือการมีเธรดหลายเธรดซึ่งอาจโต้ตอบซึ่งกันและกันซึ่งมีความจำเป็น ทำคำนวณอิสระหลายอย่างในเวลาเดียวกันที่เรียกว่าขนาน ดูen.wikipedia.org/wiki/Concurrency_(computer_science)
Lambda Fairy

29

ประโยชน์ที่ใหญ่ที่สุดคือไม่ใช่สิ่งที่คุณคุ้นเคย เลือกภาษาเช่น Scheme และเรียนรู้วิธีแก้ปัญหาแล้วคุณจะกลายเป็นโปรแกรมเมอร์ที่เก่งขึ้นในภาษาที่คุณรู้จักอยู่แล้ว มันเหมือนกับการเรียนรู้ภาษาที่สองของมนุษย์ คุณคิดว่าโดยพื้นฐานแล้วคนอื่นเป็นรูปแบบของตัวคุณเองเพราะคุณไม่มีอะไรจะเปรียบเทียบได้ การเปิดเผยต่อผู้อื่นโดยเฉพาะอย่างยิ่งสิ่งที่ไม่เกี่ยวข้องกับสิ่งที่คุณรู้อยู่แล้วเป็นคำแนะนำ


28
นั่นเป็นประโยชน์ของการเรียนรู้ไม่ใช่ประโยชน์ของกระบวนทัศน์เอง
Moe

2
แต่พวกเขาแยกกันจริงเหรอ? จากมุมมองของผู้ถามเดิมฉันจะบอกว่าไม่ - พวกเขามักจะมองหาผลประโยชน์โดยรวมในการใช้ความพยายามในการเรียนรู้ภาษาที่ใช้งานได้
Kendall Helmstetter Gelner

3
"นั่นเป็นประโยชน์ของการเรียนรู้ไม่ใช่ประโยชน์ของกระบวนทัศน์เอง" กระบวนทัศน์จะรั่วไหลไปสู่งาน OOP อื่น ๆ ของคุณและสามารถช่วยให้การพัฒนาของคุณง่ายขึ้น คุณสามารถแก้ไขปัญหาจาก "คำนวณผลลัพธ์นี้จากอินพุตนี้" และ "เขียนฟังก์ชันทั้งสองนี้ที่คำนวณข้อมูลใหม่" แทนที่จะเป็น "รอ --- สถานะของตัวแปรที่ใช้ร่วมกันบางส่วนตรงนั้นเป็นอย่างไร" และ "ฉันได้รับขั้นตอนเหล่านี้เพื่อดำเนินการตามลำดับที่ถูกต้องหรือไม่" อย่างจริงจังคุณจะได้รับประโยชน์เหล่านี้ (จากการทำความเข้าใจกระบวนทัศน์ FP) ใน Python, C #, C ++, Java คุณตั้งชื่อมัน
Jared Updike

11

เหตุใดการเขียนโปรแกรมเชิงฟังก์ชันจึงเป็นเรื่องสำคัญ
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

บทคัดย่อ

เมื่อซอฟต์แวร์มีความซับซ้อนมากขึ้นการจัดโครงสร้างให้ดีจึงมีความสำคัญมากขึ้นเรื่อย ๆ ซอฟต์แวร์ที่มีโครงสร้างดีนั้นเขียนและแก้จุดบกพร่องได้ง่ายและมีชุดโมดูลที่สามารถนำมาใช้ซ้ำได้เพื่อลดต้นทุนการเขียนโปรแกรมในอนาคต

ในบทความนี้เราแสดงให้เห็นว่าคุณลักษณะสองประการของภาษาที่ใช้งานได้โดยเฉพาะฟังก์ชันลำดับที่สูงขึ้นและการประเมินแบบขี้เกียจสามารถมีส่วนสำคัญในการแยกส่วน ตัวอย่างเช่นเราจัดการรายการและโครงสร้างตั้งโปรแกรมอัลกอริทึมเชิงตัวเลขหลายตัวและใช้การฮิวริสติกอัลฟาเบต้า (อัลกอริทึมจากปัญญาประดิษฐ์ที่ใช้ในโปรแกรมเล่นเกม) เราสรุปได้ว่าเนื่องจากความเป็นโมดูลเป็นกุญแจสำคัญในการเขียนโปรแกรมที่ประสบความสำเร็จการเขียนโปรแกรมเชิงฟังก์ชันจึงมีข้อดีที่สำคัญสำหรับการพัฒนาซอฟต์แวร์


10

ดังนั้นจุดเริ่มต้นที่ดีคือการพยายามทำความเข้าใจบางสิ่งที่เป็นไปไม่ได้ในภาษาที่จำเป็น แต่เป็นไปได้ในภาษาที่ใช้งานได้

หากคุณกำลังพูดถึงความสามารถในการคำนวณไม่มีอะไรที่เป็นไปได้ในการเขียนโปรแกรมเชิงฟังก์ชัน แต่ไม่จำเป็น (หรือในทางกลับกัน)

ประเด็นของกระบวนทัศน์การเขียนโปรแกรมที่แตกต่างกันไม่ได้อยู่ที่การทำให้สิ่งต่าง ๆ เป็นไปได้อย่างที่ไม่เคยทำได้มาก่อนการทำให้สิ่งต่างๆเป็นเรื่องง่ายที่เคยยาก

การเขียนโปรแกรมเชิงฟังก์ชันมีจุดมุ่งหมายเพื่อให้คุณเขียนโปรแกรมที่กระชับปราศจากข้อบกพร่องและสามารถขนานกันได้ง่ายขึ้น


5

ไม่จำเป็นต้องเป็นอย่างใดอย่างหนึ่ง: การใช้ภาษาเช่น C # 3.0 ช่วยให้คุณสามารถผสมผสานองค์ประกอบที่ดีที่สุดของแต่ละองค์ประกอบได้ OO สามารถใช้สำหรับโครงสร้างขนาดใหญ่ในระดับชั้นเรียนขึ้นไปรูปแบบการทำงานสำหรับโครงสร้างมาตราส่วนขนาดเล็กที่ระดับวิธีการ

การใช้รูปแบบฟังก์ชันช่วยให้สามารถเขียนโค้ดที่ประกาศเจตนาได้อย่างชัดเจนโดยไม่ต้องผสมกับคำสั่งโฟลว์การควบคุม ฯลฯ เนื่องจากหลักการเช่นการเขียนโปรแกรมแบบไม่มีผลข้างเคียงจึงง่ายกว่ามากในการหาเหตุผลเกี่ยวกับโค้ดและตรวจสอบความถูกต้อง .


5

ฉันคิดว่าตัวอย่างที่เป็นประโยชน์ที่สุดของความจำเป็นในการเขียนโปรแกรมเชิงฟังก์ชันคือการทำงานพร้อมกัน - โปรแกรมที่ใช้งานได้นั้นปลอดภัยต่อเธรดโดยธรรมชาติและเนื่องจากการเพิ่มขึ้นของฮาร์ดแวร์แบบมัลติคอร์นี้มีความสำคัญสูงสุด

การเขียนโปรแกรมเชิงฟังก์ชันยังเพิ่มความเป็นโมดูลาร์ - คุณมักจะเห็นวิธีการ / ฟังก์ชันในความจำเป็นที่ยาวเกินไป - คุณแทบจะไม่เห็นฟังก์ชันยาวเกินสองสามบรรทัด และเนื่องจากทุกอย่างถูกแยกออก - การใช้งานซ้ำจึงได้รับการปรับปรุงให้ดีขึ้นมากและการทดสอบหน่วยก็ทำได้ง่ายมาก


3

เมื่อโปรแกรมเติบโตขึ้นจำนวนคำสั่งในคำศัพท์ของเราจะสูงเกินไปทำให้ใช้งานได้ยากมาก นี่คือจุดที่การเขียนโปรแกรมเชิงวัตถุทำให้ชีวิตของเราง่ายขึ้นเพราะมันช่วยให้เราจัดระเบียบคำสั่งของเราได้ดีขึ้น เราสามารถเชื่อมโยงคำสั่งทั้งหมดที่เกี่ยวข้องกับลูกค้ากับเอนทิตีลูกค้า (คลาส) ซึ่งจะทำให้คำอธิบายชัดเจนขึ้นมาก อย่างไรก็ตามโปรแกรมยังคงเป็นลำดับของคำสั่งที่ระบุว่าควรดำเนินการอย่างไร

การเขียนโปรแกรมเชิงฟังก์ชันเป็นวิธีการขยายคำศัพท์ที่แตกต่างไปจากเดิมอย่างสิ้นเชิง ไม่ จำกัด เฉพาะการเพิ่มคำสั่งดั้งเดิมใหม่ นอกจากนี้เรายังสามารถเพิ่มโครงสร้างการควบคุมใหม่ - ดั้งเดิมที่ระบุวิธีที่เราสามารถรวมคำสั่งเข้าด้วยกันเพื่อสร้างโปรแกรม ในภาษาที่จำเป็นเราสามารถเขียนคำสั่งตามลำดับหรือใช้โครงสร้างที่สร้างขึ้นในจำนวน จำกัด เช่นลูป แต่ถ้าคุณดูโปรแกรมทั่วไปคุณจะยังเห็นโครงสร้างที่เกิดซ้ำมากมาย วิธีทั่วไปในการรวมคำสั่ง


1

อย่าคิดว่าการเขียนโปรแกรมเชิงฟังก์ชันในแง่ของ "ความต้องการ" ให้คิดว่าเป็นเทคนิคการเขียนโปรแกรมอื่นที่จะเปิดใจของคุณเช่นเดียวกับ OOP แม่แบบภาษาแอสเซมบลีและอื่น ๆ อาจเปลี่ยนวิธีคิดของคุณโดยสิ้นเชิงเมื่อ (ถ้า) คุณเรียนรู้ ท้ายที่สุดแล้วการเรียนรู้การเขียนโปรแกรมเชิงฟังก์ชันจะทำให้คุณเป็นโปรแกรมเมอร์ที่ดีขึ้น


0

หากคุณยังไม่รู้จักการเขียนโปรแกรมเชิงฟังก์ชันการเรียนรู้จะช่วยให้คุณสามารถแก้ปัญหาได้หลายวิธี

FP เป็นลักษณะทั่วไปอย่างง่ายที่ส่งเสริมฟังก์ชันให้เป็นค่าชั้นหนึ่งในขณะที่ OOP มีไว้สำหรับการจัดโครงสร้างโค้ดขนาดใหญ่ อย่างไรก็ตามมีการทับซ้อนกันอยู่บ้างโดยที่รูปแบบการออกแบบ OOP สามารถแสดงได้โดยตรงและกระชับกว่ามากโดยใช้ฟังก์ชันชั้นหนึ่ง

หลายภาษามีทั้ง FP และ OOP รวมถึง OCaml, C # 3.0 และ F #

ไชโยจอนฮาร์โรป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.