การจัดลำดับพารามิเตอร์เพื่อใช้ในการแกง


93

ฉันมีโค้ด refactored สองครั้งเมื่อเร็ว ๆ นี้เพื่อเปลี่ยนลำดับของพารามิเตอร์เนื่องจากมีโค้ดมากเกินไปที่แฮ็กชอบflipหรือ\x -> foo bar x 42เกิดขึ้น

เมื่อออกแบบลายเซ็นฟังก์ชันหลักการใดบ้างที่จะช่วยให้ฉันใช้แกงกะหรี่ให้เกิดประโยชน์สูงสุด

คำตอบ:


111

สำหรับภาษาที่รองรับการแกงกะหรี่และการใช้งานบางส่วนได้อย่างง่ายดายมีอาร์กิวเมนต์ที่น่าสนใจชุดหนึ่งซึ่งมีพื้นเพมาจาก Chris Okasaki:

  • วางโครงสร้างข้อมูลเป็นอาร์กิวเมนต์สุดท้าย

ทำไม? จากนั้นคุณสามารถเขียนการดำเนินการกับข้อมูลได้อย่างดี เช่นinsert 1 $ insert 2 $ insert 3 $ s. นอกจากนี้ยังช่วยสำหรับฟังก์ชั่นในรัฐ

ไลบรารีมาตรฐานเช่น "คอนเทนเนอร์" เป็นไปตามอนุสัญญานี้

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

  • ใส่อาร์กิวเมนต์ที่แตกต่างกันมากที่สุดเป็นอันดับสุดท้าย

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


ข้อมูลสรุปของมุมมอง Okasaki มีให้ในไลบรารี Edison ของเขา (อีกครั้งไลบรารีโครงสร้างข้อมูลอื่น):

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

เพื่อให้สอดคล้องกับสัญลักษณ์แสดงหัวข้อย่อยแรกให้ใส่อาร์กิวเมนต์ที่อาจอยู่ในโครงสร้างข้อมูลเป็นอันดับสุดท้าย ทำให้แผนที่พับและเพื่อน ๆ สะอาดขึ้น tl; dr สิ่งที่อยู่ในรายการไปล่าสุด
John F.Miller

1
การค้นหาไม่สามารถถูกล่ามโซ่ได้ดังนั้นจุดแรกจึงไม่สนับสนุนสิ่งนั้น haskell.org/haskellwiki/Parameter_orderทำให้อาร์กิวเมนต์ที่เป็นแกนกลางในทางกลับกัน - "เนื่องจากวัตถุประเภทแผนที่แสดงถึงการแมปจึงเป็นเรื่องธรรมดาที่จะมีฟังก์ชันบางอย่างที่เปลี่ยนวัตถุแผนที่เป็นฟังก์ชันที่เป็นตัวแทน"
Brandon

11

วางอาร์กิวเมนต์ที่คุณมักจะใช้ซ้ำก่อน อาร์กิวเมนต์ของฟังก์ชันเป็นตัวอย่างที่ดีของสิ่งนี้ คุณมีแนวโน้มที่จะต้องการmap fมากกว่าสองรายการที่แตกต่างกันมากกว่าที่คุณต้องการจะแมปฟังก์ชันต่างๆมากมายในรายการเดียวกัน


5
หากคุณกำลังแมปฟังก์ชันหลายอย่างในรายการเดียวกันบางทีคุณควรสร้างรายการฟังก์ชันและmap ($myList)รายการนั้นแทน
Squidly

3

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

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