Sono nuovo di Haskell e un po 'confuso su come funzionano le classi di tipi. Ecco un esempio semplificato di una cosa che sto cercando di fare:Come devono essere usati i tipi nelle classi di tipi Haskell?
data ListOfInts = ListOfInts {value :: [Int]}
data ListOfDoubles = ListOfDoubles {value :: [Double]}
class Incrementable a where
increment :: a -> a
instance Incrementable ListOfInts where
increment ints = map (\x -> x + 1) ints
instance Incrementable ListOfDoubles where
increment doubles = map (\x -> x + 1) doubles
(. Mi rendo conto che l'incremento ogni elemento di una lista può essere fatto in modo molto semplice, ma questo è solo una versione semplificata di un problema più complesso)
Il compilatore mi informa che ho più dichiarazioni di value
. Se cambio le definizioni di ListOfInts
e ListOfDoubles
come segue:.
type ListOfInts = [Int]
type ListOfDoubles = [Double]
Poi il compilatore dice "dichiarazione di istanza non ammesso per il 'ListOfInts incrementabile'" (e allo stesso modo per ListOfDoubles
Se uso Newtype, ad esempio, newtype ListOfInts = ListOfInts [Int]
, poi la il compilatore mi dice "Impossibile corrispondere al tipo atteso" ListOfInts "con tipo effettivo" [b0] "" (e analogamente per ListOfDoubles
.
La mia comprensione delle classi di tipi è che facilitano il polimorfismo, ma mi manca chiaramente qualcosa Nel primo esempio sopra, il compilatore vede solo che il parametro type a
si riferisce a un reco con un campo chiamato value
e sembra che sto cercando di definire increment
per questo tipo in più modi (piuttosto che vedere due tipi diversi, uno che ha un campo il cui tipo di un elenco di Int
s, e l'altro il cui tipo è una lista di Double
s)? E allo stesso modo per gli altri tentativi?
Grazie in anticipo.
mappa si aspetta un elenco, lo stai dando ListOfInts – Arjan