Czy istnieje sposób, aby GHC zapewniał ograniczenia klasy typu dla wpisanych otworów?

103

Obecne zachowanie

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 _

Pożądane zachowanie

Byłoby miło, gdyby GHC również powiedział mi, że wpisany otwór ma Showograniczenie dotyczące klasy typu.

Różne

Wersja GHC 7.8.1

Wizek
źródło
16
AFAIK, obecnie nie jest to możliwe, ale z pewnością byłoby przydatne. Może warto otworzyć w tym celu prośbę o funkcję w narzędziu do śledzenia błędów GHC.
kosmikus
11
Zgadzam się, że byłoby to przydatne. Zgłosiłem to jako prośbę o funkcję w GHC trac: ghc.haskell.org/trac/ghc/ticket/9479
Dominique Devriese
4
Teraz można użyć pre-Type otworów trik: show (undefined :: () -> ()); GHC powie więcej w błędzie kontroli typu.
phadej
1
Czy to propozycja funkcji, czy rzeczywiste pytanie? To znaczy, czy wiesz na pewno, że nie ma sposobu na stworzenie GHC według własnego uznania, czy też istnieje możliwość, że możesz uzyskać to, co chcesz za pomocą obecnego kompilatora, ale nie wiesz, jak to zrobić?
stakx - nie wysyłamy już
1
@stakx To trochę z obu. Pierwotnie, kiedy pisałem to pytanie, byłem zdezorientowany, dlaczego GHC nie zapewnia ograniczeń klasy typu i myślałem, że nieprawidłowo używam wpisanych otworów. Wtedy niektórzy powiedzieli mi, że obecnie nie jest to możliwe, ale można to dodać do GHC. Miałem więc nadzieję, że wkrótce zostanie dodany. Wydaje się, że wielu chciałoby go użyć. Sztuczka phadeja wydaje się działać w międzyczasie, ale nie jest tak elegancka ani łatwa w użyciu, jak byłoby to rozwiązanie oparte na typie dziury.
Wizek

Odpowiedzi:

2

To jest już ustalona w GHC 8.0 dzięki @ DominiqueDevriese za bilet GHC .

Z powodu rozszerzonego domyślnego typu , nie jest to od razu oczywiste w GHCi. Z twoim przykładem

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

domyślny typ otworu (). Najwyraźniej jest to pożądane zachowanie , chociaż należy argumentować, że rozszerzone domyślne domyślne nie powinny mieć zastosowania do dziur (ponieważ ich powszechnym zastosowaniem jest skłonienie kompilatora do podania wywnioskowanego typu).

Niemniej jednak, jeśli kompilujesz z GHC lub wyłączysz rozszerzone reguły domyślne w GHCi (via :set -XNoExtendedDefaultRules), zobaczymy wynik ulepszeń:

<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
źródło
1

Obecnie nie jest to możliwe, ale można go dodać do GHC zgodnie ze spekulacjami.

Vikas Anand
źródło
1

Wypróbuj it :: _ => _GHC 8.8+.

Michał Gajda
źródło