Apakah ada cara untuk membuat GHC memberikan batasan kelas tipe dari lubang yang diketik?

103

Perilaku saat ini

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 _

Perilaku yang diinginkan

Alangkah baiknya jika GHC juga akan memberi tahu saya bahwa lubang yang diketik memiliki Showbatasan kelas jenis.

Misc

Versi GHC 7.8.1

Wizek
sumber
16
AFAIK, saat ini ini tidak memungkinkan, tetapi pasti akan berguna. Mungkin layak untuk membuka permintaan fitur pada pelacak bug GHC untuk ini.
kosmikus
11
Saya setuju bahwa ini akan bermanfaat. Saya melaporkannya sebagai permintaan fitur di GHC trac: ghc.haskell.org/trac/ghc/ticket/9479
Dominique Devriese
4
Untuk saat ini Anda bisa menggunakan pre-jenis-lubang trik: show (undefined :: () -> ()); GHC akan memberi tahu lebih banyak dalam kesalahan tipe-cek.
phadej
1
Apakah ini permintaan fitur, atau pertanyaan sebenarnya? Artinya, apakah Anda tahu pasti bahwa tidak ada cara untuk membuat GHC sesuai keinginan Anda, atau adakah kemungkinan Anda bisa mendapatkan apa yang Anda inginkan dengan kompilator saat ini, tetapi Anda tidak yakin bagaimana caranya?
stakx - tidak lagi berkontribusi pada
1
@stakx Ini adalah sedikit dari keduanya. Awalnya ketika saya menulis pertanyaan ini saya bingung mengapa GHC tidak memberikan batasan kelas tipe, dan berpikir saya salah menggunakan lubang yang diketik. Kemudian beberapa orang mengatakan kepada saya bahwa saat ini hal tersebut tidak mungkin dilakukan, tetapi dapat ditambahkan ke GHC. Jadi saya berharap itu akan segera ditambahkan. Banyak yang sepertinya ingin menggunakannya. Trik phadej tampaknya berfungsi untuk sementara waktu, tetapi tidak seanggun atau mudah digunakan seperti solusi berbasis lubang yang diketik nantinya.
Wizek

Jawaban:

2

Ini sekarang telah diperbaiki dalam GHC 8.0 berkat tiket GHC @ DominiqueDevriese .

Karena default tipe diperpanjang , ini tidak langsung terlihat di GHCi. Dengan teladan Anda,

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

jenis lubang default (). Tampaknya ini adalah perilaku yang diinginkan , meskipun ada argumen yang harus dibuat bahwa perluasan default seharusnya tidak berlaku untuk lubang (karena penggunaan umum untuk lubang tersebut adalah agar kompilator memberi tahu Anda tipe yang disimpulkan).

Namun demikian, jika Anda mengompilasi dengan GHC atau menonaktifkan aturan default tambahan di GHCi (melalui :set -XNoExtendedDefaultRules), kami melihat hasil dari peningkatan:

<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)
crockeea.dll
sumber
1

Tidak saat ini tidak mungkin. Tapi itu dapat ditambahkan ke GHC sesuai spekulasi.

Vikas Anand
sumber
1

Coba it :: _ => _di GHC 8.8+.

Michal Gajda
sumber