ใช่. สิ่งนี้เรียกว่า "รูปแบบการผ่านของพจนานุกรม" บางครั้งเมื่อฉันทำสิ่งที่ยากลำบากโดยเฉพาะฉันต้องแยกประเภทของคลาสและเปลี่ยนเป็นพจนานุกรมเนื่องจากการส่งผ่านพจนานุกรมมีประสิทธิภาพมากกว่า1แต่บ่อยครั้งที่ค่อนข้างยุ่งยาก บางครั้งฉันใช้รูปแบบการส่งผ่านพจนานุกรมในภาษาที่ไม่ใช่ Haskell เพื่อจำลองแบบจำลอง (แต่ได้เรียนรู้ว่าโดยปกติแล้วจะไม่เป็นความคิดที่ดีเท่าที่ฟัง)
แน่นอนเมื่อใดก็ตามที่มีความแตกต่างในพลังการแสดงออกมีการแลกเปลี่ยน ในขณะที่คุณสามารถใช้ API ที่กำหนดได้หลายวิธีหากมีการเขียนโดยใช้ DPS API จะได้รับข้อมูลเพิ่มเติมหากคุณไม่สามารถ วิธีหนึ่งที่แสดงให้เห็นในทางปฏิบัตินั้นData.Set
ขึ้นอยู่กับความจริงที่ว่ามีเพียงหนึ่งOrd
พจนานุกรมต่อหนึ่งประเภท Set
ร้านค้าองค์ประกอบเรียงตามOrd
และถ้าคุณสร้างชุดกับหนึ่งในพจนานุกรมแล้วแทรกองค์ประกอบการใช้ที่แตกต่างกันอย่างใดอย่างหนึ่งตามที่จะเป็นไปได้ด้วย DPS คุณสามารถทำลายSet
's คงที่และทำให้เกิดการผิดพลาด ปัญหาที่ไม่ซ้ำกันนี้สามารถบรรเทาได้ด้วยphantom existentialพิมพ์เพื่อทำเครื่องหมายพจนานุกรม แต่ด้วยความซับซ้อนที่น่ารำคาญใน API นอกจากนี้ยังแสดงให้เห็นในแบบเดียวกับTypeable
API
ความเป็นเอกลักษณ์ไม่ได้เกิดขึ้นบ่อยนัก สิ่งที่ดีในการพิมพ์รหัสสำหรับคุณ ตัวอย่างเช่น,
catProcs :: (i -> Maybe String) -> (i -> Maybe String) -> (i -> Maybe String)
catProcs f g = f <> g
ซึ่งใช้ "โปรเซสเซอร์" สองตัวซึ่งรับอินพุตและอาจให้เอาต์พุตและเชื่อมต่อเข้าด้วยกันNothing
โดยไม่ต้องเขียนจะต้องเขียนใน DPS ดังนี้:
catProcs f g = (<>) (funcSemi (maybeSemi listSemi)) f g
เราจำเป็นต้องสะกดประเภทที่เราใช้อีกครั้งแม้ว่าเราจะสะกดมันออกมาแล้วในประเภทของลายเซ็นและถึงแม้จะซ้ำซ้อนเพราะคอมไพเลอร์รู้ทุกประเภทแล้ว เนื่องจากมีเพียงวิธีเดียวในการสร้างSemigroup
ประเภทที่กำหนดคอมไพเลอร์จึงสามารถทำได้เพื่อคุณ สิ่งนี้มีเอฟเฟกต์ประเภท "ดอกเบี้ยทบต้น" เมื่อคุณเริ่มกำหนดอินสแตนซ์พารามิเตอร์จำนวนมากและใช้โครงสร้างประเภทของคุณในการคำนวณสำหรับคุณเช่นเดียวกับในData.Functor.*
combinators และนี่จะใช้เพื่อผลที่ยอดเยี่ยมโดยderiving via
ที่คุณสามารถรับ โครงสร้างพีชคณิต "มาตรฐาน" ของประเภทที่เขียนเพื่อคุณ
และอย่าแม้แต่จะให้ฉันเริ่มต้นกับ MPTC และ fundeps ซึ่งฟีดข้อมูลกลับเข้าสู่การพิมพ์และการอนุมาน ฉันไม่เคยลองเปลี่ยนสิ่งเหล่านี้เป็น DPS - ฉันสงสัยว่ามันจะเกี่ยวข้องกับการพิสูจน์ความเท่าเทียมกันหลายประเภท - แต่ในกรณีใด ๆ ฉันแน่ใจว่ามันจะทำงานได้ดีกว่าสำหรับสมองของฉันมากกว่าที่ฉันจะรู้สึกสบายใจ กับ
-
1 U nless คุณใช้reflection
ในกรณีที่พวกเขากลายเป็นเทียบเท่าในอำนาจ - แต่reflection
ยังสามารถที่จะยุ่งยากในการใช้งาน