ฉันมีโค้ด refactored สองครั้งเมื่อเร็ว ๆ นี้เพื่อเปลี่ยนลำดับของพารามิเตอร์เนื่องจากมีโค้ดมากเกินไปที่แฮ็กชอบflip
หรือ\x -> foo bar x 42
เกิดขึ้น
เมื่อออกแบบลายเซ็นฟังก์ชันหลักการใดบ้างที่จะช่วยให้ฉันใช้แกงกะหรี่ให้เกิดประโยชน์สูงสุด
ฉันมีโค้ด refactored สองครั้งเมื่อเร็ว ๆ นี้เพื่อเปลี่ยนลำดับของพารามิเตอร์เนื่องจากมีโค้ดมากเกินไปที่แฮ็กชอบflip
หรือ\x -> foo bar x 42
เกิดขึ้น
เมื่อออกแบบลายเซ็นฟังก์ชันหลักการใดบ้างที่จะช่วยให้ฉันใช้แกงกะหรี่ให้เกิดประโยชน์สูงสุด
คำตอบ:
สำหรับภาษาที่รองรับการแกงกะหรี่และการใช้งานบางส่วนได้อย่างง่ายดายมีอาร์กิวเมนต์ที่น่าสนใจชุดหนึ่งซึ่งมีพื้นเพมาจาก Chris Okasaki:
ทำไม? จากนั้นคุณสามารถเขียนการดำเนินการกับข้อมูลได้อย่างดี เช่นinsert 1 $ insert 2 $ insert 3 $ s
. นอกจากนี้ยังช่วยสำหรับฟังก์ชั่นในรัฐ
ไลบรารีมาตรฐานเช่น "คอนเทนเนอร์" เป็นไปตามอนุสัญญานี้
บางครั้งอาร์กิวเมนต์สำรองจะได้รับเพื่อวางโครงสร้างข้อมูลก่อนดังนั้นจึงสามารถปิดได้โดยให้ฟังก์ชันบนโครงสร้างคงที่ (เช่นการค้นหา) ที่กระชับขึ้นเล็กน้อย อย่างไรก็ตามฉันทามติในวงกว้างดูเหมือนว่าจะชนะน้อยกว่าโดยเฉพาะอย่างยิ่งเนื่องจากมันผลักดันให้คุณไปสู่โค้ดที่มีวงเล็บอย่างมาก
สำหรับฟังก์ชันแบบวนซ้ำเป็นเรื่องปกติที่จะใส่อาร์กิวเมนต์ที่แตกต่างกันมากที่สุด (เช่นตัวสะสม) เป็นอาร์กิวเมนต์สุดท้ายในขณะที่อาร์กิวเมนต์ที่แปรผันน้อยที่สุด (เช่นอาร์กิวเมนต์ของฟังก์ชัน) ในตอนเริ่มต้น สิ่งนี้เข้ากันได้ดีกับรูปแบบสุดท้ายของโครงสร้างข้อมูล
ข้อมูลสรุปของมุมมอง Okasaki มีให้ในไลบรารี Edison ของเขา (อีกครั้งไลบรารีโครงสร้างข้อมูลอื่น):
วางอาร์กิวเมนต์ที่คุณมักจะใช้ซ้ำก่อน อาร์กิวเมนต์ของฟังก์ชันเป็นตัวอย่างที่ดีของสิ่งนี้ คุณมีแนวโน้มที่จะต้องการmap f
มากกว่าสองรายการที่แตกต่างกันมากกว่าที่คุณต้องการจะแมปฟังก์ชันต่างๆมากมายในรายการเดียวกัน
map ($myList)
รายการนั้นแทน
ฉันมักจะทำในสิ่งที่คุณทำเลือกคำสั่งบางอย่างที่ดูดีแล้วทำการ refactor ถ้าปรากฎว่าคำสั่งอื่นดีกว่า ลำดับขึ้นอยู่กับว่าคุณจะใช้ฟังก์ชันอย่างไร (ตามธรรมชาติ)