Jestem nowy dla Haskella i trochę nie rozumiem, jak działają klasy typów. Oto uproszczony przykład coś próbuję zrobić:Jak powinny być stosowane typy w klasach typu 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
(. Zdaję sobie sprawę, że zwiększając każdy element listy można zrobić bardzo prosto, ale jest to po prostu uproszczona wersja bardziej złożonego problemu)
Kompilator mówi, że mam wiele deklaracji value
. Jeśli zmienić definicje ListOfInts
i ListOfDoubles
następująco:.
type ListOfInts = [Int]
type ListOfDoubles = [Double]
Następnie kompilator mówi „nielegalne deklarację Instancji" Incrementable ListOfInts”(i podobnie dla ListOfDoubles
jeśli używam newtype, np newtype ListOfInts = ListOfInts [Int]
, wówczas kompilator mówi mi: "Nie można dopasować oczekiwanego typu" ListOfInts "do rzeczywistego typu" [b0] "" (i podobnie do ListOfDoubles
.
Moje zrozumienie klas typów polega na tym, że ułatwiają polimorfizm, ale wyraźnie brakuje mi czegoś W pierwszym przykładzie powyżej kompilator widzi, że parametr type a
odnosi się do reco rd z polem o nazwie value
i wygląda na to, że próbuję zdefiniować increment
dla tego typu na wiele sposobów (zamiast widzieć dwa różne typy, taki, który ma pole, którego typ listy Int
s, i drugi, którego typ to jest lista Double
s)? I podobnie do innych prób?
Z góry dziękuję.
mapa oczekuje na listę, dajesz jej ListOfInts – Arjan