Bunu neden yapmak istediğinizi anlıyorum, ancak ne yazık ki, Haskell sınıflarının sizin söylediğiniz şekilde "açık" görünmesi yalnızca bir yanılsama olabilir. Birçok insan, aşağıda açıklayacağım nedenlerden dolayı, bunu yapma olasılığının Haskell spesifikasyonunda bir hata olduğunu düşünüyor. Her neyse, örnek için gerçekten uygun değilse, ya sınıfın bildirildiği modülde ya da türün bildirildiği modülde bildirilmeniz gerekir, bu muhtemelen bir newtype
veya başka bir sarmalayıcı kullanmanız gerektiğine dair bir işarettir. türünün etrafında.
Yetim örneklerden kaçınılması gereken nedenler, derleyicinin rahatlığından çok daha derindir. Diğer cevaplardan da görebileceğiniz gibi, bu konu oldukça tartışmalı. Tartışmayı dengelemek için, tecrübeli Haskeller arasında çoğunluğun düşüncesi olduğunu düşündüğüm, asla, asla öksüz örnekler yazmamalı bakış açısını açıklayacağım. Kendi fikrim ortada bir yerde, sonunda açıklayacağım.
Sorun, aynı sınıf ve tür için birden fazla örnek bildirimi bulunduğunda, standart Haskell'de hangisinin kullanılacağını belirleyen bir mekanizma olmadığı gerçeğinden kaynaklanmaktadır. Aksine, program derleyici tarafından reddedilir.
Bunun en basit etkisi, modülünüzün çok uzak bir bağımlılığında başka birinin yaptığı bir değişiklik nedeniyle derlemeyi aniden durduracak mükemmel çalışan bir programa sahip olabilmenizdir.
Daha da kötüsü, uzak bir değişiklik nedeniyle çalışan bir programın çalışma zamanında çökmeye başlaması mümkündür . Belirli bir örnek bildiriminden geldiğini varsaydığınız bir yöntemi kullanıyor olabilirsiniz ve sessizce, programınızın açıklanamaz şekilde çökmeye başlamasına neden olacak kadar farklı olan farklı bir örnekle değiştirilebilir.
Bu sorunların asla başlarına gelmeyeceğinin garantisini isteyen kişiler, herhangi biri, herhangi bir yerde, belirli bir tür için belirli bir sınıfın bir örneğini ilan etmişse, başka hiçbir örnek yazılan hiçbir programda bir daha ilan edilmemelidir kuralına uymalıdır. kimse tarafından. Elbette, newtype
yeni bir örnek bildirmek için a kullanmanın geçici bir çözümü var , ancak bu her zaman en azından küçük bir rahatsızlık ve bazen de büyük bir rahatsızlıktır. Yani bu anlamda, kasıtlı olarak öksüz örnekleri yazanlar oldukça kaba davranıyorlar.
Peki bu sorunla ilgili ne yapılmalı? Anti-orphan-instance kampı, GHC uyarısının bir hata olduğunu, bir öksüz örnek bildirme girişimini reddeden bir hata olması gerektiğini söylüyor. Bu arada, öz disiplin uygulamalı ve ne pahasına olursa olsun onlardan kaçınmalıyız.
Gördüğünüz gibi, bu potansiyel sorunlar için çok endişelenmeyenler var. Aslında, sizin önerdiğiniz gibi, öksüz vakaların kaygıları ayırmak için bir araç olarak kullanılmasını teşvik ediyorlar ve bir kişinin sadece duruma göre bir sorun olmadığından emin olması gerektiğini söylüyorlar. Başkalarının öksüz durumlarından, bu tavrın fazla şövalye olduğuna ikna olacak kadar çok rahatsız oldum.
Bence doğru çözüm, Haskell'in içe aktarma mekanizmasına örneklerin içe aktarılmasını kontrol edecek bir uzantı eklemek olacaktır. Bu, sorunları tamamen çözmeyecektir, ancak programlarımızı dünyada zaten var olan öksüz vakaların zararlarına karşı korumaya biraz yardımcı olacaktır. Ve sonra, zamanla, bazı sınırlı durumlarda, belki de bir yetim vakasının o kadar da kötü olmayabileceğine ikna olabilirim. (Yetim kampındaki bazılarının benim önerime karşı çıkmasının nedeni de bu cazibedir.)
Tüm bunlardan çıkarım, en azından şimdilik, herhangi bir öksüz vakayı ilan etmekten kaçınmanızı, başka bir sebep yoksa başkalarına karşı saygılı olmanızı şiddetle tavsiye ediyorum. Bir newtype
.