ใช่. สิ่งนี้เรียกว่า "รูปแบบการผ่านของพจนานุกรม" บางครั้งเมื่อฉันทำสิ่งที่ยากลำบากโดยเฉพาะฉันต้องแยกประเภทของคลาสและเปลี่ยนเป็นพจนานุกรมเนื่องจากการส่งผ่านพจนานุกรมมีประสิทธิภาพมากกว่า1แต่บ่อยครั้งที่ค่อนข้างยุ่งยาก บางครั้งฉันใช้รูปแบบการส่งผ่านพจนานุกรมในภาษาที่ไม่ใช่ Haskell เพื่อจำลองแบบจำลอง (แต่ได้เรียนรู้ว่าโดยปกติแล้วจะไม่เป็นความคิดที่ดีเท่าที่ฟัง)
แน่นอนเมื่อใดก็ตามที่มีความแตกต่างในพลังการแสดงออกมีการแลกเปลี่ยน ในขณะที่คุณสามารถใช้ API ที่กำหนดได้หลายวิธีหากมีการเขียนโดยใช้ DPS API จะได้รับข้อมูลเพิ่มเติมหากคุณไม่สามารถ วิธีหนึ่งที่แสดงให้เห็นในทางปฏิบัตินั้นData.Setขึ้นอยู่กับความจริงที่ว่ามีเพียงหนึ่งOrdพจนานุกรมต่อหนึ่งประเภท Setร้านค้าองค์ประกอบเรียงตามOrdและถ้าคุณสร้างชุดกับหนึ่งในพจนานุกรมแล้วแทรกองค์ประกอบการใช้ที่แตกต่างกันอย่างใดอย่างหนึ่งตามที่จะเป็นไปได้ด้วย DPS คุณสามารถทำลายSet's คงที่และทำให้เกิดการผิดพลาด ปัญหาที่ไม่ซ้ำกันนี้สามารถบรรเทาได้ด้วยphantom existentialพิมพ์เพื่อทำเครื่องหมายพจนานุกรม แต่ด้วยความซับซ้อนที่น่ารำคาญใน API นอกจากนี้ยังแสดงให้เห็นในแบบเดียวกับTypeableAPI
ความเป็นเอกลักษณ์ไม่ได้เกิดขึ้นบ่อยนัก สิ่งที่ดีในการพิมพ์รหัสสำหรับคุณ ตัวอย่างเช่น,
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ยังสามารถที่จะยุ่งยากในการใช้งาน