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.