Saya mengerti mengapa Anda ingin melakukan ini, tetapi sayangnya, ini mungkin hanya ilusi bahwa kelas Haskell tampak "terbuka" dengan cara yang Anda katakan. Banyak orang merasa bahwa kemungkinan melakukan ini adalah bug dalam spesifikasi Haskell, untuk alasan yang akan saya jelaskan di bawah. Bagaimanapun, jika itu benar-benar tidak sesuai untuk instance Anda perlu dideklarasikan baik di modul tempat kelas dideklarasikan atau di modul tempat tipe dideklarasikan, itu mungkin merupakan tanda bahwa Anda harus menggunakan a newtype
atau pembungkus lain di sekitar tipe Anda.
Alasan mengapa instance orphan perlu dihindari berjalan jauh lebih dalam daripada kenyamanan kompilator. Topik ini agak kontroversial, seperti yang Anda lihat dari jawaban lain. Untuk menyeimbangkan diskusi, saya akan menjelaskan sudut pandang bahwa seseorang tidak boleh, pernah, menulis contoh yatim piatu, yang menurut saya merupakan pendapat mayoritas di antara Haskeller yang berpengalaman. Pendapat saya sendiri ada di tengah-tengah, yang akan saya jelaskan di akhir.
Masalahnya berasal dari fakta bahwa ketika lebih dari satu deklarasi instance ada untuk kelas dan tipe yang sama, tidak ada mekanisme dalam Haskell standar untuk menentukan mana yang akan digunakan. Sebaliknya, program tersebut ditolak oleh kompilator.
Efek paling sederhana dari itu adalah bahwa Anda dapat memiliki program yang bekerja dengan sempurna yang tiba-tiba akan berhenti mengkompilasi karena perubahan yang dibuat orang lain dalam ketergantungan modul Anda yang jauh.
Lebih buruk lagi, mungkin saja program kerja mulai mogok saat runtime karena perubahan yang jauh. Anda bisa menggunakan metode yang Anda asumsikan berasal dari deklarasi instance tertentu, dan metode itu bisa diganti secara diam-diam dengan instance lain yang hanya cukup berbeda untuk menyebabkan program Anda mulai mogok tanpa alasan.
Orang yang menginginkan jaminan bahwa masalah ini tidak akan pernah terjadi pada mereka harus mengikuti aturan bahwa jika ada orang, di mana pun, pernah mendeklarasikan instance dari kelas tertentu untuk jenis tertentu, tidak ada contoh lain yang harus dideklarasikan lagi dalam program apa pun yang ditulis. oleh siapapun. Tentu saja, ada solusi untuk menggunakan a newtype
untuk mendeklarasikan instance baru, tetapi itu setidaknya selalu merupakan ketidaknyamanan kecil, dan terkadang yang besar. Jadi dalam pengertian ini, mereka yang menulis contoh yatim piatu dengan sengaja menjadi kurang sopan.
Jadi apa yang harus dilakukan tentang masalah ini? Kamp anti-orphan-instance mengatakan bahwa peringatan GHC adalah bug, itu harus berupa kesalahan yang menolak upaya apa pun untuk mendeklarasikan instance orphan. Sementara itu, kita harus menjalankan disiplin diri dan menghindarinya dengan cara apa pun.
Seperti yang Anda lihat, ada orang yang tidak terlalu mengkhawatirkan masalah potensial tersebut. Mereka benar-benar mendorong penggunaan contoh yatim piatu sebagai alat untuk pemisahan masalah, seperti yang Anda sarankan, dan mengatakan bahwa seseorang harus memastikan berdasarkan kasus per kasus bahwa tidak ada masalah. Saya telah cukup sering direpotkan oleh contoh yatim piatu orang lain untuk diyakinkan bahwa sikap ini terlalu angkuh.
Saya pikir solusi yang tepat adalah menambahkan ekstensi ke mekanisme impor Haskell yang akan mengontrol impor instance. Itu tidak akan menyelesaikan masalah sepenuhnya, tapi itu akan memberikan bantuan untuk melindungi program kami dari kerusakan dari kasus yatim piatu yang sudah ada di dunia. Dan kemudian, seiring berjalannya waktu, saya mungkin menjadi yakin bahwa dalam kasus tertentu yang terbatas, mungkin seorang anak yatim piatu mungkin tidak seburuk itu. (Dan godaan itu adalah alasan mengapa beberapa orang di kamp anti-yatim piatu menentang lamaran saya.)
Kesimpulan saya dari semua ini adalah bahwa setidaknya untuk saat ini, saya akan sangat menyarankan agar Anda menghindari mendeklarasikan kasus yatim piatu, untuk mempertimbangkan orang lain jika tidak ada alasan lain. Gunakan a newtype
.