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?
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
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)'. –
È 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