ฉันเข้าใจว่าทำไมคุณถึงต้องการทำสิ่งนี้ แต่น่าเสียดายที่อาจเป็นเพียงภาพลวงตาที่คลาส Haskell ดูเหมือนจะ "เปิด" ในแบบที่คุณพูด หลายคนรู้สึกว่าความเป็นไปได้ในการทำเช่นนี้เป็นข้อบกพร่องในข้อกำหนดของ Haskell ด้วยเหตุผลที่ฉันจะอธิบายด้านล่าง อย่างไรก็ตามหากมันไม่เหมาะสมกับอินสแตนซ์จริงๆคุณจำเป็นต้องประกาศในโมดูลที่มีการประกาศคลาสหรือในโมดูลที่มีการประกาศประเภทนั่นอาจเป็นสัญญาณว่าคุณควรใช้newtype
กระดาษห่อหุ้มหรืออื่น ๆ รอบประเภทของคุณ
สาเหตุที่ต้องหลีกเลี่ยงอินสแตนซ์ orphan ที่ลึกกว่าความสะดวกของคอมไพเลอร์ หัวข้อนี้ค่อนข้างขัดแย้งดังที่คุณเห็นจากคำตอบอื่น ๆ เพื่อความสมดุลของการอภิปรายฉันจะอธิบายมุมมองที่ว่าเราไม่ควรเคยเขียนอินสแตนซ์เด็กกำพร้าซึ่งฉันคิดว่าเป็นความคิดเห็นส่วนใหญ่ในหมู่ Haskellers ที่มีประสบการณ์ ความคิดเห็นของฉันอยู่ตรงกลางซึ่งฉันจะอธิบายในตอนท้าย
ปัญหาเกิดจากข้อเท็จจริงที่ว่าเมื่อมีการประกาศอินสแตนซ์มากกว่าหนึ่งรายการสำหรับคลาสและประเภทเดียวกันไม่มีกลไกใดในมาตรฐาน Haskell ที่จะระบุว่าจะใช้แบบใด คอมไพเลอร์ปฏิเสธโปรแกรม
เอฟเฟกต์ที่ง่ายที่สุดคือคุณสามารถมีโปรแกรมที่ทำงานได้อย่างสมบูรณ์ซึ่งจะหยุดการรวบรวมทันทีเนื่องจากการเปลี่ยนแปลงที่คนอื่นทำให้การพึ่งพาโมดูลของคุณห่างไกล
ที่แย่กว่านั้นคือเป็นไปได้ที่โปรแกรมที่ใช้งานจะเริ่มหยุดทำงานขณะรันไทม์เนื่องจากมีการเปลี่ยนแปลงที่อยู่ไกลออกไป คุณสามารถใช้วิธีการที่คุณสมมติว่ามาจากการประกาศอินสแตนซ์บางอย่างและอาจถูกแทนที่ด้วยอินสแตนซ์อื่นที่แตกต่างกันมากพอที่จะทำให้โปรแกรมของคุณเริ่มหยุดทำงานอย่างอธิบายไม่ได้
ผู้ที่ต้องการรับประกันว่าปัญหาเหล่านี้จะไม่เกิดขึ้นกับพวกเขาจะต้องปฏิบัติตามกฎที่ว่าหากใครก็ตามที่เคยประกาศอินสแตนซ์ของคลาสบางประเภทมาแล้วจะต้องไม่ประกาศอินสแตนซ์อื่นอีกในโปรแกรมใด ๆ ที่เขียนขึ้น โดยใครก็ได้ แน่นอนว่ามีวิธีแก้ปัญหาในการใช้newtype
เพื่อประกาศอินสแตนซ์ใหม่ แต่อย่างน้อยก็มักจะเกิดความไม่สะดวกเล็กน้อยและบางครั้งก็เป็นเรื่องสำคัญ ดังนั้นในแง่นี้ผู้ที่เขียนอินสแตนซ์เด็กกำพร้าโดยเจตนาจึงค่อนข้างไม่สุภาพ
แล้วปัญหานี้ควรทำอย่างไร? ค่ายต่อต้านเด็กกำพร้ากล่าวว่าคำเตือน GHC เป็นข้อบกพร่องต้องเป็นข้อผิดพลาดที่ปฏิเสธความพยายามใด ๆ ในการประกาศอินสแตนซ์เด็กกำพร้า ในระหว่างนี้เราต้องฝึกวินัยในตนเองและหลีกเลี่ยงสิ่งเหล่านี้โดยเสียค่าใช้จ่ายทั้งหมด
ดังที่คุณได้เห็นมีผู้ที่ไม่กังวลกับปัญหาที่อาจเกิดขึ้นเหล่านั้น จริงๆแล้วพวกเขาสนับสนุนให้ใช้อินสแตนซ์เด็กกำพร้าเป็นเครื่องมือในการแยกข้อกังวลตามที่คุณแนะนำและบอกว่าควรตรวจสอบเป็นกรณี ๆ ไปว่าไม่มีปัญหา ฉันรู้สึกไม่สะดวกมานานพอสมควรจากกรณีเด็กกำพร้าของคนอื่นที่ต้องเชื่อมั่นว่าทัศนคตินี้เป็นเรื่องที่น่ากลัวเกินไป
ฉันคิดว่าทางออกที่ถูกต้องคือการเพิ่มส่วนขยายให้กับกลไกการนำเข้าของ Haskell ที่จะควบคุมการนำเข้าอินสแตนซ์ นั่นจะไม่สามารถแก้ปัญหาได้อย่างสมบูรณ์ แต่จะช่วยปกป้องโปรแกรมของเราจากความเสียหายจากอินสแตนซ์เด็กกำพร้าที่มีอยู่แล้วในโลก จากนั้นเมื่อเวลาผ่านไปฉันอาจเชื่อมั่นว่าในบางกรณีที่ จำกัด บางทีอินสแตนซ์เด็กกำพร้าอาจไม่เลวร้ายนัก (และการล่อลวงนั้นเป็นเหตุผลที่บางคนในค่ายต่อต้านเด็กกำพร้าไม่เห็นด้วยกับข้อเสนอของฉัน)
ข้อสรุปของฉันจากทั้งหมดนี้ก็คืออย่างน้อยในขณะนี้ฉันขอแนะนำอย่างยิ่งให้คุณหลีกเลี่ยงการประกาศอินสแตนซ์เด็กกำพร้าใด ๆ โดยคำนึงถึงผู้อื่นหากไม่มีเหตุผลอื่น ใช้ไฟล์newtype
.