GHC sadece birini seçer ve bu doğru bir seçimdir aynı kısıtı için herhangi iki sözlükleri eşit olması gerekiyordu
OverlappingInstances ve IncoherentInstances tahrip gücünün temelde eşittir;. Ikisi de örneğini kaybetmek tasarımla tutarlılık (programınızdaki her iki eşit kısıtlama, aynı sözlük tarafından karşılanır) Üst üste binme örnekleri, duruma göre hangi örneklerin kullanılacağını öğrenmek için biraz daha fazla yetenek sağlar, ancak bu işe yarar değildir. Dicts'i birinci sınıf değerler olarak geçme noktasına geldiğinizde, örtüşen örnekleri geniş ölçüde eşdeğer olarak kabul ettiğimde sadece örtüşen Değerleri kullanmayı düşünürdüm (ör., Int) gibi belirli bir tür için daha verimli ancak başka bir şekilde eşit bir uygulama, ancak o zaman bile, eğer bu özel uygulamayı yazmak için performans hakkında yeterince dikkatli olursam, eğer böyle bir duruma geldiğinde kullanılmazsa bir performans hatası değildir. ?
Kısaca, OverlappingInstances'ı kullanırsanız, burada hangi sözlüğün seçileceğini sorma hakkından vazgeçersiniz.
Artık, çakışmayı OverlappingInstances olmadan kesebildiğiniz doğru. Aslında, yetimler olmadan ve FlexibleInstances dışında herhangi bir uzantı olmadan da yapabilirsiniz (problem, EsnekInstances etkinleştirildiğinde "yetim" tanımının yanlış olmasıdır). Bu, kısmen düzeltilmemiş çok uzun süredir devam eden bir GHC hatasıdır, çünkü (a) aslında herkesin bildiği kadarıyla çökmelere sebep olamayacağı ve (b) birçok program olabileceği için aslında programın ayrı bölümlerinde aynı kısıtlama için birden çok örneğe sahip olmaktan ve kaçınılması zor olabilir. Temel konuya dönersek, prensip olarak, GHC'nin bir kısıtlamayı sağlamak için mevcut olan herhangi bir sözlüğü seçebilmesi önemlidir, çünkü bunların eşit olmaları gerekse bile, GHC'nin bazılarında daha fazla statik bilgiye sahip olabilir. Page 18 diğerlerinden daha. Örneğiniz açıklayıcı olmak için biraz basittir, ancak bir argümanı bar
; Genel olarak GHC, Dict
aracılığıyla aktarılan sözlük hakkında hiçbir şey bilmiyor, bu yüzden bilinmeyen bir işleve çağrı olarak bakmak zorundasınız, ancak () kapsamındaki foo
örneğini kapsamaktasınız. Bar a
kısıtlama sözlüğünden gelen bar
'un T
'un bar
olduğunu ve bilinen bir işlev için bir çağrı üretebildiğini ve potansiyel olarak T
' bar
'u ve sonuç olarak daha fazla optimizasyon gerçekleştirdiğini bilir.
Uygulamada, GHC şu anda bu kadar akıllı değil ve mevcut en içteki sözlüğü kullanıyor. Her zaman en uzak sözlüğü kullanmak zaten daha iyi olurdu. Ancak, birden fazla sözlük bulunan yerlerde bunun gibi durumlar çok yaygın değildir, bu nedenle test etmek için iyi bir ölçütümüz yoktur.
Neden sadece iki uzantıya sahip olduğumuzu (tutarsız/örtüşüyor) değil bir. Tek başına üst üste binmenin hala "güvenli" olduğu izlenimi edinilebilir, ve sadece gerçek olanın başlamasıyla tutarsızlık başlar. – chi
"Aynı kısıtlama için iki sözlükte eşit olması gerekiyordu." - Olması gerekiyordu, ama değil. Bu iddiayı ihlal eden örneklerden, tutarsız veya çakışan örneklerden birini kullanmadan yanıtımı inceleyin. –
Evet, örnek uyum kaybıyla kastediyorum. –