the documentation for -XUndecidableInstances'u biliyorum, ancak bir detaylandırma isteğimi düşündüm.UndecidableInstances ne zaman güvenlidir? GHC uzantısına ilişkin bazı genel sorular
I (-XMultiParamTypeClasses izin verilir), iki çok parametreli typeclasses Şimdi
class Foo a b
class Goo a b
olduğunu varsayalım, bir parametreli veri tip I Foo
zaman örneğini olmak için
data Bar a b
olduğunu varsayalım onun parametrelerinden biri Goo
örneğinin bir parçasıdır. Öyle işte ben yazmak istiyorum ne, önceki cümle tam terminolojiyi kullanan emin değilim:
instance (Goo c d) => Foo d (Bar a d)
Ben UndecidableInstances
uzantısı olmadan izin yok. Bunun doğru olduğunu düşünüyorum çünkü bu örnek c
türüne atıfta bulunmuyor mu?
ben ...
- Sadece uzantısını etkinleştirmek mıdır? Birisi bana ne tür bir belaya bulaşabileceğini açıklayabilir mi?
Foo
için başka bir parametre ekleyin, böylece son örnek bildirimiFoo c d (Bar a d)
gibi bir şey olur? Bununla ilgili bir sorun,Foo
'un diğer örneklerinin hiçbir zaman böyle bir "dördüncü tip parametresi" için herhangi bir gönderme yapmadığım (yani kodumun ilgisiz bölümlerindeinstance Foo A B
formunun örnekleridir) olabileceğidir, bu nedenle bunlar kırılır. Örneğimi düzeltmeyi tercih ederim, sınıfım değil.- Yeni bir sınıf
FooGoo
yeterli parametreleri ile oluştur? Bu durumda kendimi tekrar ediyorum gibi hissediyorum, ama en azından ilgisiz sınıfları kırmayacağım.
Hiç kimse bilgelik sözüne sahip midir?
Teşekkürler. Bu bir dereceye kadar netleştirme getiriyor."IncoherentInstances" öğesini kötülük olarak tanımlamak için – gspr
+1. –
Ayrıca "Goo cd" kısıtlaması 'Goo' nun işlevsel bağımlılığı' d -> c' olmadıkça 'Foo d (Bar reklamı)' örneğini kullanılamaz hale getireceğini düşünüyorum. Aksi takdirde derleyici hangi Goo'nun örneğine karar verir? kullanmak? Tüm 'Goo' örnekleri 'd' içinde gerçekleşmeyen bir tür değişkeni' c' varsa, o zaman bu tür parametresini bırakmak için @ barsoap'ın önerisi gitmek için yoldur. – mokus