Haskell - przedefiniowanie operatora dla mojego typu

1

Pytanie od nooba.

Mam sobie typ:

data Wielomian = Wielomian [Double]
    deriving (Show, Eq)

I funkcję dodającą:
dodajWielomiany :: Wielomian -> Wielomian -> Wielomian

Chciałbym przeładować operator dodawania, aby operować tym typem w bardziej naturalny sposób. Próbowałem tak:

(+) :: Wielomian -> Wielomian -> Wielomian
w1 + w2 = dodajWielomiany w1 w2

Ale wtedy dostaję błąd:

Wielomiany.hs:16:42:
    Ambiguous occurrence `+'
    It could refer to either `Wielomiany.+',
                             defined at Wielomiany.hs:38:4
                          or `Prelude.+',
                             imported from `Prelude' at Wielomiany.hs:1:8-17
                             (and originally defined in `GHC.Num')

Rozumiem, że w ten sposób przykryłem standardowe działanie operatora.

Znalazłem inny sposób:

instance Num Wielomian where
    (+) v1 v2 = dodajWielomiany v1 v2

Nie za bardzo rozumiem tą konstrukcję, ale dostaję błąd mówiący, że również powinienem przedefiniować *, abs, signum, fromInteger.

Czy nie da się dla jakiegoś typu zdefiniować pojedynczego operatora?

Korzystam z GHC.

2

Nieszczególnie, w haskellu nie ma za bardzo czegoś takiego jak przeładowywanie funkcji.

Polecane rozwiązanie dla Twojego problemu:

(<+>) :: Wielomian -> Wielomian -> Wielomian
w1 <+> w2 = dodajWielomiany w1 w2

Czy inny szlaczek - tworzysz w ten sposób operator <+> służący do dodawania wielomianów. To idiomatyczne rozwiązanie w haskellu, więc nie masz się co martwić ;].

(+) służy w haskellu, podobnie jak w matematyce, do dodawania liczb. Jeśli chcesz dodawać wielomiany, musisz uczynić z wielomianu liczbę. To:

instance Num Wielomian where
    (+) v1 v2 = dodajWielomiany v1 v2 

Można porównać do implementowania interfejsu 'liczby'. Jako że ten 'interfejs' zawiera więcej funkcji, jak *, abs, signum, fromInteger, nic dziwnego że nie działa.

1

Ok, dzięki za odpowiedź ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.