คุณออกแบบโปรแกรมใน Haskell หรือภาษาโปรแกรมภาษาอื่น ๆ


52

ฉันมีประสบการณ์ในการเขียนโปรแกรมเชิงวัตถุเช่น c # หรือ ruby ฉันรู้วิธีออกแบบโปรแกรมในลักษณะเชิงวัตถุวิธีสร้างคลาสและวัตถุและวิธีกำหนดความสัมพันธ์ระหว่างพวกเขา ฉันรู้รูปแบบการออกแบบด้วย

คนเขียนโปรแกรมที่ใช้งานได้อย่างไร พวกเขาจะเริ่มอย่างไร มีรูปแบบการออกแบบสำหรับภาษาที่ใช้งานได้หรือไม่? วิธีการเช่นการเขียนโปรแกรมที่รุนแรงหรือการพัฒนาที่คล่องตัวสามารถใช้กับภาษาที่ใช้งานได้หรือไม่?


1
คำถามที่เกี่ยวข้อง: stackoverflow.com/questions/3077866/…
HaskellElephant

คำตอบ:


24

ฉันเขียนคำตอบของฉันเป็นหลักโดยคำนึงถึง 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 เพื่อทดสอบหรือพิสูจน์คุณสมบัติเกี่ยวกับฟังก์ชั่นที่คุณเขียน


"ฉันสามารถอธิบายได้อย่างละเอียด แต่โลกไม่ต้องการอีก Monad คล้ายคลึงกัน" - เราต้องการอุปมาอุปมัยมากกว่าสำหรับพระและคุณเป็นหนึ่งในสิ่งที่ดีที่สุดที่ฉันเคยเห็น
Adam Gent

1
คำตอบที่ดี แต่ฉันคิดว่าการอภิปรายเกี่ยวกับรูปแบบการออกแบบของคุณอาจทำให้เข้าใจผิดเล็กน้อย ในขณะที่คุณไม่ต้องการรูปแบบการออกแบบสไตล์ OO / GOF ใน Haskell - ในความเป็นจริงมันจะไร้สาระที่จะลองใช้ - รูปแบบตัวเองเป็นเพียงวิธีที่ชุมชนสื่อสารวิธีแก้ไขปัญหาที่เกิดขึ้นซ้ำแล้วซ้ำอีก ชุมชน Haskell ยังเด็กมากดังนั้นยังมีอีกหลายรูปแบบที่จะพูดถึง แต่ถ้าคุณถามตัวอย่างของรูปแบบ Haskell ฉันจะพูดถึงสิ่งต่าง ๆ เช่น GADTs หรือ Arrowized FRP
rtperson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.