Sto imparando a usare i tipi in Haskell.Come si applicano i vincoli di funzione nei metodi di istanza in Haskell?
Considerare la seguente implementazione di una classe di caratteri T
con una funzione di classe con tipo vincolato f
.
class T t where
f :: (Eq u) => t -> u
data T_Impl = T_Impl_Bool Bool | T_Impl_Int Int | T_Impl_Float Float
instance T T_Impl where
f (T_Impl_Bool x) = x
f (T_Impl_Int x) = x
f (T_Impl_Float x) = x
Quando carico questo in GHCI 7.10.2, ottengo il seguente errore:
Couldn't match expected type ‘u’ with actual type ‘Float’ ‘u’ is a rigid type variable bound by the type signature for f :: Eq u => T_Impl -> u at generics.hs:6:5 Relevant bindings include f :: T_Impl -> u (bound at generics.hs:6:5) In the expression: x In an equation for ‘f’: f (T_Impl_Float x) = x
Che cosa sto facendo/comprensione sbagliata? Mi sembra ragionevole che si voglia specializzare una classe di tipografie in un'istanza fornendo un costruttore di dati e un'implementazione della funzione di accompagnamento. La parte
Couldn't match expected type '
u
' with actual type 'Float
'
è particolarmente confuso. Perché u
non corrisponde a Float
se u
ha solo il vincolo che deve essere qualificato come un tipo Eq
(Float
s fare così avanti)?
il vincolo non è un problema tuo - il problema è che stai dicendo: * non importa quale tipo di 'Eq' desideri da me come risultato - Posso fornirlo * – Carsten
Dove dico questo? – FK82
in 'f :: Eq u => t -> u' -' t' è noto dal contesto - il 'u' è lì con un implicito 'allall' – Carsten