Próbuję zaimplementować funkcję (Drzewo a) -> (Drzewo a) -> (Drzewo a). Funkcja powinna sumować wartości węzłów i zwracać drzewo z sumami. Niestety, otrzymałem następujący komunikat o błędzie:
Aufgabe10.hs: 4: 11: Nieoczekiwany typ „Tree a” W deklaracji klasy dla „+” Deklaracja klasy powinna mieć formę klasa + a b c gdzie ...
To jest mój kod:
data Tree a = Node a (Tree a) (Tree a)
|Empty
class (+) (Tree a) where
(+) :: (Tree a) (Tree a) -> (Tree a)
instance (Num a) => (+) (Tree a) (Tree a) where
(+) (Node a1 b1 c1) (Node a2 b2 c2) = (Node (a1+a2) ((+) b1 b2) ((+) c1 c2))
(+) Empty (Node a b c) = (Node a b c)
(+) (Node a b c) Empty = (Node a b c)
Ok, zmieniłem teraz klasę na Plus i nazwałem funkcję plus, ponieważ nie chcę implementować wszystkich funkcji odrętwiałych. To jest nowy kod:
data Tree a = Node a (Tree a) (Tree a)
|Empty
class Plus a where
plus:: (Tree a) -> (Tree a) -> (Tree a)
instance (Num a) => Plus (Tree a) where
Plus (Node a1 b1 c1) (Node a2 b2 c2) = (Node (a1+a2) (Plus b1 b2) (Plus c1 c2))
Plus Empty (Node a b c) = (Node a b c)
Plus (Node a b c) Empty = (Node a b c)
Pojawiają się następujące błędy:
Aufgabe10.hs: 8: 9: Wiązania wzorców (z wyjątkiem prostych zmiennych) nie są dozwolone w deklaracjach instancji Plus (węzeł a1 b1 c1) (węzeł a2 b2 c2) = (Węzeł (a1 + a2) (Plus b1 b2) (Plus c1 c2))
Aufgabe10.hs: 9: 9: Wiązania wzorców (z wyjątkiem prostych zmiennych) nie są dozwolone w deklaracjach instancji Plus Pusty (Węzeł a b c) = (Węzeł a b c)
Aufgabe10.hs: 10: 9: Wiązania wzorców (z wyjątkiem prostych zmiennych) nie są dozwolone w deklaracjach instancji Plus (Węzeł a b c) Pusty = (Węzeł a b c)
Odpowiedzi:
2 dla odpowiedzi № 1Spojrzeć na Co to są klasy?: zauważysz, że deklaracja klas typów obejmuje:
- nazwa rodzaju czcionki;
- zmienna typu.
Dlatego twoja deklaracja powinna zaczynać się od
class (+) a where
nie
class (+) (Tree a) where
chociaż wolałbym
class Plus a where
To rozwiązuje pierwszy z twoich problemów. :)
Odpowiadanie na zaktualizowaną wersję ...
Czy widzisz różnicę między Plus
i plus
? Tak, jedna jest pisana wielkimi literami, a druga nie. Czy wiesz, co to znaczy w Haskell?
Plus
, jak odnosi się każde słowo pisane wielkimi literami w języku Haskell typy (w tym przypadku, klasa typu nazywa Plus
).
Z drugiej strony, funkcje muszą być zawsze pisane małymi literami - i dlatego zdefiniowałeś plus :: (Tree a) -> (Tree a) -> (Tree a)
małymi literami.
Masz już problem?
Zamiast
instance (Num a) => Plus (Tree a) where
Plus (Node a1 b1 c1) (Node a2 b2 c2) = (Node (a1+a2) (Plus b1 b2) (Plus c1 c2))
Plus Empty (Node a b c) = (Node a b c)
Plus (Node a b c) Empty = (Node a b c)
powinieneś napisać
instance (Num a) => Plus (Tree a) where
plus (Node a1 b1 c1) (Node a2 b2 c2) = (Node (a1+a2) (Plus b1 b2) (Plus c1 c2))
plus Empty (Node a b c) = (Node a b c)
plus (Node a b c) Empty = (Node a b c)
ponieważ definiujesz zachowanie funkcji plus
gdy Tree
jest instancją Plus
. Rozumiem? :)