GHC'nin yazılan deliklerin tür sınıfı kısıtlamalarını sağlamasını sağlamanın bir yolu var mı?


103

Mevcut davranış

Prelude> show _

<interactive>:7:6:
    Found hole ‘_’ with type: a0
    Where: a0 is an ambiguous type variable
    Relevant bindings include it :: String (bound at <interactive>:7:1)
    In the first argument of show’, namely ‘_’
    In the expression: show _
    In an equation for it’: it = show _

Istenen davranış

GHC'nin de yazılan deliğin Showtip sınıfı kısıtlamasına sahip olduğunu söylemesi güzel olurdu .

Çeşitli

GHC Sürüm 7.8.1


16
AFAIK, bu şu anda mümkün değil, ancak kesinlikle faydalı olacaktır. Bunun için GHC hata izleyicide bir özellik isteği açmaya değer olabilir.
kosmikus

11
Bunun yararlı olacağına katılıyorum. Bunu GHC trac'inde
Dominique Devriese

4
Şimdilik önceden tip delikleri kullanabilirsiniz show (undefined :: () -> ()):; GHC, tip kontrol hatasıyla daha fazlasını anlatacaktır.
phadej

1
Bu bir özellik isteği mi yoksa gerçek bir soru mu? Yani, GHC'yi istediğiniz gibi yapmanın bir yolu olmadığından emin misiniz, yoksa mevcut derleyici ile istediğinizi elde etme olasılığınız var mı, ama nasıl olduğundan emin değil misiniz?
stakx -

1
@stakx Her ikisinden de biraz. Başlangıçta bu soruyu yazdığımda, GHC'nin neden tür sınıfı kısıtlamalarını sağlamadığını ve yazılan delikleri yanlış kullandığımı düşündüğümde kafam karışmıştı. Sonra bazıları bana şu anda bunu yapmanın mümkün olmadığını, ancak GHC'ye eklenebileceğini söyledi. Bu yüzden yakında ekleneceğini umuyordum. Birçoğu onu kullanmak istiyor gibi görünüyor. phadej'in hilesi bu arada işe yarıyor gibi görünüyor, ancak daktilo edilmiş delik tabanlı bir çözümün olabileceği kadar zarif veya kullanımı kolay değil.
Wizek

Yanıtlar:


2

@ DominiqueDevriese'in GHC bileti sayesinde bu sorun artık GHC 8.0'da düzeltildi .

Genişletilmiş tür varsayılanı nedeniyle , bu GHCi'de hemen açık değildir. Örneğinizle,

> show _

  <interactive>:7:6: error:
     Found hole: _h :: ()
      Or perhaps ‘_h is mis-spelled, or not in scope
     In the first argument of show’, namely ‘_h
      In the expression: show _h
      In an equation for it’: it = show _h
     Relevant bindings include
        it :: String (bound at <interactive>:7:1)

deliğin tipi varsayılan olarak ayarlanmıştır (). Bu görünüşe göre istenen davranıştır , ancak genişletilmiş varsayılan ayarlamanın delikler için geçerli olmaması gerektiğine dair bir argüman olmasına rağmen (bunlar için genel bir kullanım derleyicinin size çıkarılan türü söylemesini sağlamaktır).

Bununla birlikte, GHC ile derlerseniz veya GHCi'de (aracılığıyla :set -XNoExtendedDefaultRules) genişletilmiş varsayılan kuralları devre dışı bırakırsanız , iyileştirmelerin sonucunu görürüz:

<interactive>:3:1: error:
     Ambiguous type variable a0 arising from a use of show
      prevents the constraint ‘(Show a0)’ from being solved.
      Probable fix: use a type annotation to specify what a0 should be.
      These potential instances exist:
        instance Show Ordering -- Defined in ‘GHC.Show’
        instance Show Integer -- Defined in ‘GHC.Show’
        instance Show a => Show (Maybe a) -- Defined in ‘GHC.Show’
        ...plus 22 others
        ...plus 11 instances involving out-of-scope types
        (use -fprint-potential-instances to see them all)
     In the expression: show _
      In an equation for it’: it = show _

<interactive>:3:6: error:
     Found hole: _ :: a0
      Where: a0 is an ambiguous type variable
     In the first argument of show’, namely ‘_’
      In the expression: show _
      In an equation for it’: it = show _
     Relevant bindings include
        it :: String (bound at <interactive>:3:1)

1

Şu anda mümkün değil, ancak spekülasyonlara göre GHC'ye eklenebilir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.