ฉันเขียนคำตอบของฉันเป็นหลักโดยคำนึงถึง Haskell แม้ว่าแนวคิดหลายอย่างจะนำไปใช้กับภาษาอื่น ๆ เช่น Erlang, Lisp (s) และ ML ได้ดีพอ ๆ กัน บางอันใช้กับ Ruby, Python, Perl และ Javascript
คนเขียนโปรแกรมที่ใช้งานได้อย่างไร พวกเขาจะเริ่มอย่างไร
โดยการเขียนฟังก์ชั่น เมื่อคุณกำลังเขียนโปรแกรมฟังก์ชั่นคุณกำลังเขียนmain
หรือคุณกำลังเขียนฟังก์ชั่นผู้ช่วย บางครั้งเป้าหมายหลักของคุณอาจจะเขียนประเภทข้อมูลที่มีฟังก์ชั่นที่เกี่ยวข้องต่าง ๆ ที่ทำงานกับมัน
ฟังก์ชั่นการเขียนโปรแกรมใช้งานได้ดีเหมาะกับวิธีการจากบนลงล่างและจากล่างขึ้นบน Haskell ขอแนะนำอย่างยิ่งให้เขียนโปรแกรมของคุณเป็นภาษาระดับสูงแล้วกำหนดรายละเอียดการออกแบบระดับสูงของคุณ ดูminimum
ตัวอย่าง:
minimum :: (Ord a) => [a] -> a
minimum xs = foldl1 min xs
ฟังก์ชั่นในการค้นหาองค์ประกอบที่เล็กที่สุดในรายการนั้นเขียนเพียงแค่การสำรวจเส้นทางโดยใช้ฟังก์ชั่นขั้นต่ำเพื่อเปรียบเทียบแต่ละองค์ประกอบด้วย "การสะสม" หรือค่าต่ำสุดในปัจจุบัน
มีรูปแบบการออกแบบสำหรับภาษาที่ใช้งานได้หรือไม่?
มีสองสิ่งที่สามารถบรรจุ "รูปแบบการออกแบบ" เป็น IMHO, ฟังก์ชั่นขั้นสูงและmonads มาพูดถึงอดีตกันก่อน ฟังก์ชั่นที่สูงกว่าคือฟังก์ชั่นที่ใช้ฟังก์ชั่นอื่นเป็นอินพุตหรือสร้างฟังก์ชั่นเป็นเอาต์พุต ภาษาการทำงานใด ๆ โดยทั่วไปทำให้การใช้งานหนักของmap
, filter
และfold
(มักเรียกอีกอย่างว่า "ย่อ"): สามขั้นสูง - สั่งฟังก์ชันที่ใช้ฟังก์ชั่นกับรายการในวิธีต่าง ๆ เหล่านี้แทนที่สำเร็จรูปสำหรับห่วงในวิธีที่สวยงาม การส่งผ่านฟังก์ชั่นเป็นพารามิเตอร์เป็นประโยชน์อย่างยิ่งต่อการเขียนโปรแกรม "รูปแบบการออกแบบ" จำนวนมากสามารถทำได้ง่ายขึ้นโดยใช้ฟังก์ชั่นที่สูงกว่าความสามารถในการสร้างของคุณเองและสามารถใช้ประโยชน์จากไลบรารีมาตรฐานที่ทรงพลังซึ่งเต็มไปด้วยฟังก์ชั่นที่มีประโยชน์
Monads เป็นหัวข้อ "scarier" แต่พวกเขาไม่ได้น่ากลัวขนาดนั้น วิธีที่ฉันโปรดปรานในการนึกถึงพระก็คือการคิดว่ามันเป็นการห่อหุ้มฟังก์ชั่นในฟองสบู่และให้พลังวิเศษแก่ฟังก์ชั่นนั้น ฉันทำได้อย่างละเอียด แต่โลกไม่ต้องการอีก Monad คล้ายคลึงกัน ดังนั้นฉันจะย้ายไปที่ตัวอย่างด่วน สมมติว่าฉันต้องการใช้รูปแบบการออกแบบ "nondeterministic" ฉันต้องการเรียกใช้การคำนวณเดียวกันสำหรับอินพุตต่าง ๆ ในเวลาเดียวกัน ฉันไม่ต้องการเลือกเพียงอินพุตเดียวฉันต้องการเลือกทั้งหมด นั่นคือรายการ monad:
allPlus2 :: [Int] -> [Int]
allPlus2 xs = do x <- xs
return (x + 2)
ทีนี้วิธีการแสดงนี้เป็นจริงmap
แต่เพื่อดูภาพประกอบคุณสามารถดูว่ารายการ monad อนุญาตให้ฉันเขียนฟังก์ชั่นที่ดูเหมือนว่ามันทำงานได้บนค่าเดียว แต่มอบให้กับมหาอำนาจทุกองค์ประกอบใน รายการ มหาอำนาจอื่น ๆ ได้แก่ ความล้มเหลวของรัฐการโต้ตอบกับ "โลกภายนอก" และการดำเนินการแบบขนาน มหาอำนาจเหล่านี้มีอำนาจมากและภาษาการเขียนโปรแกรมส่วนใหญ่อนุญาตให้ฟังก์ชั่นที่มีพลังอำนาจอาละวาดรอบตัว คนส่วนใหญ่บอกว่า Haskell ไม่อนุญาตมหาอำนาจเหล่านี้เลย แต่จริงๆแล้ว Haskell มีพวกมันไว้ใน monads เพื่อให้เอฟเฟกต์ของพวกมันถูก จำกัด และสังเกตได้
tl; dr Grokking ฟังก์ชั่นการสั่งซื้อที่สูงขึ้นและ monads คือ Haskell เทียบเท่ากับรูปแบบการออกแบบ grokking เมื่อคุณเรียนรู้แนวคิดของ Haskell เหล่านี้คุณจะเริ่มคิดว่า "รูปแบบการออกแบบ" เป็นวิธีการแก้ปัญหาราคาถูกเพื่อจำลองพลังของ Haskell
วิธีการเช่นการเขียนโปรแกรมที่รุนแรงหรือการพัฒนาที่คล่องตัวสามารถใช้กับภาษาที่ใช้งานได้หรือไม่?
ฉันไม่เห็นสิ่งใดที่เชื่อมโยงกลยุทธ์การจัดการเหล่านี้เข้ากับกระบวนทัศน์การเขียนโปรแกรมใด ๆ ดังที่ phynfo กล่าวไว้การเขียนโปรแกรมที่ใช้งานได้จริงบังคับให้คุณทำการสลายฟังก์ชั่นทำลายปัญหาใหญ่เป็นปัญหาย่อยดังนั้นมินิเหตุการณ์สำคัญควรเป็นส่วนหนึ่งของเค้ก มีเครื่องมืออย่าง QuickCheck และ Zeno เพื่อทดสอบหรือพิสูจน์คุณสมบัติเกี่ยวกับฟังก์ชั่นที่คุณเขียน