/ / Haskell nieoczekiwany typ w deklaracji klasy - klasa, haskell

Haskell nieoczekiwany typ w deklaracji klasy - klasa, haskell

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 № 1

Spojrzeć na Co to są klasy?: zauważysz, że deklaracja klas typów obejmuje:

  1. nazwa rodzaju czcionki;
  2. 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? :)