2012-04-23 12 views
5

Ich stieß auf etwas, das ich neugierig finde, während ich mit der interaktiven Haskell-Eingabeaufforderung (ghci) herumspielte. Der folgende Code 7.0.4Typ Zweideutigkeit mit Zahlen

[minBound..1] 

wirft die folgende Ausnahme unter GHCI laufen:

<interactive>:1:12: 
    Ambiguous type variable `t0' in the constraints: 
     (Num t0) arising from the literal `1' at <interactive>:1:12 
     (Enum t0) arising from the arithmetic sequence `minBound .. 1' 
       at <interactive>:1:1-13 
     (Bounded t0) arising from a use of `minBound' 
        at <interactive>:1:2-9 
    Probable fix: add a type signature that fixes these type variable(s) 
    In the expression: 1 
    In the expression: [minBound .. 1] 
    In an equation for `it': it = [minBound .. 1] 

Ich weiß, dass die oben Schreiben als [minBound..1 :: Int] würde deutlich machen, dass ' 1 'hier soll ein Int sein, aber meine Frage ist, wo liegt die Zweideutigkeit? '1' könnte als Int, Integer, Float oder Doppel, aber keiner von ihnen außer Int gehören zur Bounded Klasse interpretiert werden. Gibt es also eine andere Klasse, die literal 1 könnte als Maskerade? Wenn nicht, was dann?

Antwort

10

Per den defaulting rules, ein eingeschränkter Typen Variable wird versucht, durch säumige gelöst werden, wenn

  • alle Einschränkungen haben die Form C a; a nicht als Argument für eine Typkonstruktor in der Einschränkung erscheinen, und
  • mindestens eine der beteiligten Klassen ist eine numerische Klasse und
  • alle Klassen sind in der Prelude oder die Standardbibliotheken definiert.

Der abgeleitete Typ des Ausdrucks [minBound .. 1] ist

[minBound .. 1] :: (Num a, Enum a, Bounded a) => [a] 

so die säumigen Regeln gelten. Aber für säumige nur im Standard aufgeführten Typen Erklärung des Moduls berücksichtigt werden - in Ermangelung einer Standarderklärung, der Standard Standard von (Integer, Double) angenommen wird, dh eines eingeschränkten mehrdeutig Typen Variable zu lösen, zuerst Integer versucht wird, und wenn das nicht alle Einschränkungen erfüllt, wird Double ausprobiert. Wenn dies auch nicht alle Einschränkungen erfüllt, schlägt der Standardfehler fehl und die Kompilierung schlägt mit einem Fehler ambiguous type variable¹ fehl.

Im vorliegenden Fall erfüllt weder Integer noch Double die Bedingung Bounded, daher schlägt der Fehler fehl.

¹ In GHCI oder mit der ExtendedDefaultRules Erweiterung aktiviert, säumige auch wenn keine numerische Klasse versucht wird, unter den Zwängen ist aber Show ist, und die Standard-Voreinstellung wird durch () erweitert.

+0

Gute Antwort, danke; Ich machte Annahmen darüber, wie Haskells Typinferenz funktioniert, jetzt weiß ich es besser – Aky