2015-06-04 13 views
5

In GHCi Geben iHaskell Liste der Liste Typ Fehler

let xs = [1, 'a'] 

es den Fehler beklagt sofort:

<interactive>:28:11: 
No instance for (Num Char) arising from the literal ‘1’ 
In the expression: 1 
In the expression: [1, 'a'] 
In an equation for ‘xs’: xs = [1, 'a'] 

Allerdings, wenn ich

let xs = [1, [1, 1]] 

geben Sie nur übergeben. Und es beschwert sich, wenn ich versuche xs zu drucken:

<interactive>:5:1: 
No instance for (Num [t0]) arising from a use of ‘it’ 
In a stmt of an interactive GHCi command: print it 

Ich denke, Haskell eine statische Art Sprache ist so jede Art Fehler sollte in der Kompilierung gefangen werden. Ich frage mich, warum die oben genannten 2 Fehler zu unterschiedlichen Zeiten abgefangen werden?

Antwort

8

1 ist ein polymorpher Wert vom Typ Num a => a. Also in [1, [2, 3]] haben wir [2, 3] :: Num a => [a]; Da alle Listenelemente denselben Typ haben müssen, schließen wir, dass wir 1 :: Num a => [a] haben müssen. Das ist ein bisschen komisch - es ist komisch, an 1 als einen Listentyp zu denken - aber kann vollkommen gültig sein, wenn jemand eine ausreichend seltsame Instanz von Num erstellt. Die Überprüfung, ob eine Instanz vorhanden ist, wird solange unterdrückt, bis Sie versuchen, die Instanz zu verwenden. Dies gibt Ihnen die Möglichkeit, die Instanz zu definieren, nachdem Sie den Wert mithilfe der Instanz definiert haben. Also beschweren Sie sich erst, wenn Sie versuchen, etwas mit der Liste [1, [2, 3]] zu tun.

Nur um zu veranschaulichen, was ich meine, kann man schreiben:

instance Num a => Num [a] where 
    fromInteger n = pure (fromInteger n) 
    (+) = liftA2 (+) 
    (-) = liftA2 (-) 
    (*) = liftA2 (*) 
    abs = liftA abs 
    signum = liftA signum 

(Tatsächlich ist diese Instanz für jede Applicative arbeitet, und ist manchmal sogar nützlich.) Dann in GHCI:

> let xs = [1, [1, 1]] 
> xs 
[[1],[1,1]] 

Siehe ma, keine Fehler!

+3

Warum gilt das nicht für eine mögliche "Num Char" -Instanz? –

+0

@ReidBarton Gute Frage! Ich bin mir da eigentlich nicht sicher. Ich würde vermuten, dass GHC bei der Auflösung der Instanz es ablehnt, Beweise für monomorphe Einschränkungen zu finden. aber das ist nur eine Vermutung. –

+0

Sie könnten eine 'Num Char'-Instanz basierend auf der' Enum Char'-Instanz definieren. Die gleiche Argumentation würde gelten, aber die Instanz ist hier nicht enthalten. –