2011-02-16 14 views
13

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 ...

  1. Sadece uzantısını etkinleştirmek mıdır? Birisi bana ne tür bir belaya bulaşabileceğini açıklayabilir mi?
  2. Foo için başka bir parametre ekleyin, böylece son örnek bildirimi Foo 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ümlerinde instance 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.
  3. 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?

cevap

10

Bunun doğru olduğunu düşünürmüyorum, çünkü bu durum c türüne başvurmuyor mu?

Evet, kodu (here itibaren) bağlı değildir:

bağlamda her iddianın için: Hayır tipi değişken kafasında daha yılında iddiasını daha fazla örneği vardır

Genel olarak, birlikte bir döngü oluşturacak başka örnekler eklemediğiniz sürece güvende olmalısınız. OverlappingInstances söz konusu olduğunda sadece kıllı (ve derleyiciye bağımlı) şeyler gelir ve IncoherentInstances'a gittiğinizde kötülüğü deler.

Neyi başarmaya çalıştığınız hakkında daha fazla şey bilmeden, sağlam bir tasarım önerisi vermek zordur, ancak ilk kontrol etmeniz gereken şey gerçekten Goo'ya bir parametre olarak c'ye sahip olmanız gerekip gerekmediğidir. Bu şekilde gerçekleştirmek istediğiniz şeyi ifade edebileceksiniz:

class Goo d where 
    bar :: d c -> Int 
    baz :: Quux c => d c -> Int 
+0

Teşekkürler. Bu bir dereceye kadar netleştirme getiriyor."IncoherentInstances" öğesini kötülük olarak tanımlamak için – gspr

+0

+1. –

+2

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

İlgili konular