2014-04-12 2 views
102

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 auch mir sagen würde, dass das eingegebene Loch die Show Typklasse Bedingung hat.Gibt es eine Möglichkeit, GHC die Typklasseneinschränkungen von typisierten Löchern zur Verfügung zu stellen?

Misc

GHC Version 7.8.1

+16

AFAIK, dies derzeit nicht möglich ist, aber es wäre sicherlich nützlich sein. Vielleicht lohnt es sich, eine Feature-Anfrage auf dem GHC-Bug-Tracker dafür zu öffnen. – kosmikus

+11

Ich stimme zu, dass dies nützlich wäre. Ich habe es als eine Feature-Anfrage auf dem GHC-Trac gemeldet: https://ghc.haskell.org/trac/ghc/ticket/9479 –

+4

Für jetzt könnten Sie vor-Typ-Löcher Trick verwenden: 'show (undefined ::() ->()) '; GHC wird mehr im Typprüfungsfehler erzählen. – phadej

Antwort

1

Nein zur Zeit seiner nicht possible.But es nach den Spekulationen zu GHC hinzugefügt werden.

2

Dies ist jetzt in GHC 8.0 dank @ DominiqueDevrieses GHC ticket behoben.

Aufgrund von extended type defaulting 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) 

die Art des Lochs zu () Verzug geraten. Dies ist anscheinend die desired behavior, obwohl es ein Argument gibt, dass die erweiterte Standardisierung nicht auf Lücken angewendet werden sollte (als eine übliche Verwendung für sie ist es, den Compiler dazu zu bringen, Ihnen den abgeleiteten Typ zu sagen).

Dennoch, wenn Sie mit GHC kompilieren oder erweiterte Standardregeln in GHCi deaktivieren (über :set -XNoExtendedDefaultRules), 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)