Gibt es eine Möglichkeit, GHC dazu zu bringen, die Typklassenbeschränkungen für typisierte Löcher bereitzustellen?


103

Aktuelles Verhalten

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 _

Gewünschtes Verhalten

Es wäre schön, wenn GHC mir auch sagen würde, dass das typisierte Loch die ShowTypklassenbeschränkung hat.

Sonstiges

GHC Version 7.8.1


16
AFAIK, das ist derzeit nicht möglich, aber es wäre sicherlich nützlich. Es könnte sich lohnen, hierfür eine Feature-Anfrage auf dem GHC-Bug-Tracker zu öffnen.
Kosmikus

11
Ich bin damit einverstanden, dass dies nützlich wäre. Ich habe es als Feature-Anfrage auf dem GHC-Trac gemeldet
Dominique Devriese

4
Im Moment könnten Sie einen Trick mit vorgefertigten Löchern verwenden : show (undefined :: () -> ()); GHC wird mehr in der Typprüfung Fehler erzählen.
Phadej

1
Ist dies eine Funktionsanforderung oder eine tatsächliche Frage? Das heißt, wissen Sie sicher, dass es keine Möglichkeit gibt, GHC nach Ihren Wünschen zu erstellen, oder besteht die Möglichkeit, dass Sie mit dem aktuellen Compiler das bekommen, was Sie wollen, aber Sie sind sich nicht sicher, wie?
stakx - trägt nicht mehr

1
@stakx Es ist ein bisschen von beidem. Als ich diese Frage schrieb, war ich ursprünglich verwirrt, warum GHC die Einschränkungen für Typklassen nicht bereitstellte, und dachte, ich würde falsch eingegebene Löcher verwenden. Dann sagten mir einige, dass dies derzeit nicht möglich ist, aber zu GHC hinzugefügt werden könnte. Also hatte ich gehofft, dass es bald hinzugefügt wird. Viele scheinen es gerne benutzen zu wollen. Der Trick von phadej scheint in der Zwischenzeit zu funktionieren, ist aber nicht so elegant oder einfach zu bedienen wie eine Lösung auf der Basis von typisierten Löchern.
Wizek

Antworten:


2

Dies ist jetzt in GHC 8.0 dank des GHC-Tickets von @ DominiqueDevriese behoben .

Aufgrund der Standardeinstellung für erweiterte Typen ist dies in GHCi nicht sofort ersichtlich. Mit Ihrem Beispiel,

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

Der Typ des Lochs ist standardmäßig (). Dies ist anscheinend das gewünschte Verhalten , obwohl ein Argument vorgebracht werden muss, dass erweiterte Standardeinstellungen nicht für Löcher gelten sollten (da diese häufig verwendet werden, um den Compiler zu veranlassen, Ihnen den abgeleiteten Typ mitzuteilen).

Wenn Sie jedoch mit GHC kompilieren oder erweiterte Standardregeln in GHCi (via :set -XNoExtendedDefaultRules) deaktivieren , sehen wir das Ergebnis der Verbesserungen:

<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

Nein, derzeit ist es nicht möglich. Aber es kann gemäß den Spekulationen zu GHC hinzugefügt werden.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.