2016-10-31 3 views
4

Als ich :t 4 in GHCI eingeben bekomme ichWarum gibt ghci aus (Num a) => a für: t 4 und nicht (Ord a) => a?

Prelude> :t 4 
4 :: Num t => t 

Ich verstehe, warum 4 nicht nur ein Int oder eine ganze Zahl ist, und dass es infered unten nach oben, aber ich verstehe nicht, warum 4 nicht als Ord t => t gezeigt oder noch richtig etwas wie folgt aus:

4 :: (Ord t || Num t) => t 

Da 4 ist sowohl ein Ord und ein Num aber Ord und Num haben keine Verbindung ...

Warum also :t 4 Ausgabe nur Num?

+0

Dies wird im [haskell report] beschrieben (https://www.haskell.org/onlinereport/haskell2010/haskellch6.html#x13-1360006.4.1) – Lee

+4

Angenommen, ich gab '4' den Typ' Ord t = > t'. Jetzt stelle ich fest, dass 'Bool' eine Instanz von' Ord' ist. Daher '4 :: Bool'. Sollte '4 :: Bool '' True' oder 'False' sein, und warum? –

+0

@Lee Btw, es gibt ähnliche Fragen in Bezug auf Typ Standardregeln: https://StackOverflow.com/Questions/39251728/Ghcirandomio-Type-Inferenz Ich habe versucht, es zu beantworten und den Bericht zu verstehen, aber immer noch keine klare Sicht. Vielleicht erfahrener _Haskell_ Benutzer können helfen :) – Shersh

Antwort

9

Nicht alle Typen mit Instanzen für Num haben auch Fälle für Ord, und Sie brauchen nur den fromInteger Teil Num die überladenen Zahlenliterale Haskell hat zu haben. Zum Beispiel hat Complex von Data.Complex eine Num Instanz, aber keine Ord. In diesem Fall ist 4nicht ein Ord.

ghci> import Data.Complex 
ghci> let x = 1 :: Complex Double 
ghci> let y = 2 :: Complex Double 
ghci> x < y 
<interactive> 
    * No instance for (Ord (complex Double)) arising from use of `<' 
    * In the expression: x < y 
     In the equation for `it': it = x < y 
ghci> 

Wie @Lee kommentiert, ist dies das Verhalten in der report umrissen.

+0

Beachten Sie, dass Sie erklärt haben, warum der Typ nicht '(Ord t, Num t) => t 'ist, nicht warum es nicht' (Ord t || Num t) => t '(was keine gültige Syntax ist, aber ich nehme an, soll sagen "t könnte ein' Ord '* oder * eine' Num 'sein). – sepp2k

+0

@ sepp2k Das stimmt - ich hatte das' 'nicht interpretiert Ich denke, ich indirekt antworten ... – Alec

+0

Ok thx. Die Sache mit der 'fromIntegral' in den Link von @Lee zur Verfügung gestellt war sehr hilfreich. Noch hilfreicher war der Link zu Abschnitt [3.4 .3] (https://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-790004.3.4) Also, wenn ich '(3 <4)' schreibe: um den eigentlichen Typ von '4' abzuleiten Der Compiler muss einen Typ finden, der '(Num t, Ord t) => t 'erfüllt, was einer von' Int', 'Integer',' Float', 'Double' sein kann (oder noch mehr mit externen Modulen) Das ist mehrdeutig und würde zu einem Fehler führen, aber für Num werden diese Mehrdeutigkeiten durch Defaul gelöst ting zu (in diesem Fall) Integer. – Databyte

Verwandte Themen