2013-10-11 14 views
12

Recentemente ho dato un'occhiata a Haskell, usando LYAH.Haskell perché "Num x" richiede "Mostra x"?

avrei dovuto vedermela con le classi di tipo e ha scritto questa funzione test rapido:

foo :: (Num x) => x -> String 
foo x = show x ++ "!" 

Ma che produce questo errore:

test.hs:2:9: 
    Could not deduce (Show x) arising from a use of `show' 
    from the context (Num x) 
    bound by the type signature for foo :: Num x => x -> String 
    at test.hs:1:8-29 
    Possible fix: 
     add (Show x) to the context of 
     the type signature for foo :: Num x => x -> String 

Ma secondo Lyah:

To join Num, a type must already be friends with Show and Eq.

Quindi, se tutto in Num è un sottoinsieme di Show e Eq, perché devo modificare la firma del tipo su foo :: (Num x, Show x) => x -> String perché funzioni? Non dovrebbe essere possibile dedurre che uno Num è anche in grado di mostrare?

risposta

18

Le informazioni in LYAH sono vecchie. Il release notes for GHC 7.4.1 dicono che:

The Num class no longer has Eq or Show superclasses.

Avrete bisogno di scrivere,

foo :: (Num x, Show x) => x -> String 

(In realtà, il foo hai scritto non richiede Num x, in modo da poter omettere che per evitare un vincolo inutile.)

+1

Quindi quali sottoclassi di 'Num' _don't_ hanno 'Eq' o' Show' più? Non vedo alcun elenco di ciò che ha guadagnato quelli (o perché è stato cambiato affatto, in realtà.) – charmlessCoin

+6

Era un po 'di classe (Eq a, Mostra a) => Num a dove {...} ', ora è solo 'class Num a where {...}'. Non c'era bisogno di avere 'Eq' e' Show' come superclasse: un'istanza 'Num' non implica un'istanza di nessuna di queste classi (come' Ord' implica 'Eq'), né dipende da loro ('Num' non ha leggi e le definizioni predefinite per i suoi 'metodi' non si riferiscono a' Eq' o 'Show'). Penso che sia per questo che 'Num' è diventato una classe autonoma. Meno requisiti significa che la classe consente più istanze, come 'Num b => Num (a -> b)'. –

+3

È importante notare che si tratta di un cambiamento di GHC; lo standard Haskell richiede ancora le superclassi 'Show' e' Eq'.In senso stretto, questo rende GHC un compilatore non compatibile con Haskell; tuttavia, molto probabilmente questo cambiamento si farà strada nello standard successivo, molto presto come 'Applicativo' sarà una superclasse di' Monad'. – David

1

non dovresti scrivere:

(Num x) => x -> String 

Invece di

(Num x) x -> String 

E per quanto ne so questa eredità è almeno obsoleto.

3

Haskell, sia 98 e 2010 entrambi richiedono che tutte le istanze di Num siano istanze su Show ed Eq. Questo è in gran parte un incidente storico.

GHC, il compilatore Haskell più popolare, si discosta dallo standard qui senza richiedere alcun pragma. Ciò è stato fatto per consentire ai funtori applicativi di essere esempi di Num e godere dei vantaggi della sintassi sovraccaricata.

Problemi correlati