Прежде всего, давайте рассмотрим ваш оригинальный код
type Pol = [(Int,Int)]
suma :: Pol -> Pol -> Pol
suma [] ys = ys
suma xs [] = xs
suma ((c1,g1):xs) ((c2,g2):ys)
| g1 == g2 = ((c1+c2,g1):(suma xs ys))
| g1 > g2 = ((c1,g1):(suma xs ((c2,g2):ys)))
| g1 < g2 = ((c2,g2):(suma ((c1,g1):xs) ys))
Если вы делаете:
let p1 = [(5,0),(1,1),(7,2)]::Pol
let p2 = [(1,2),(3,1),(2,0)]::Pol
тогда вы получите:
suma p1 p2
[(1,2),(3,1),(7,0),(1,1),(7,2)]
Это не «неправильно», но это не то, что можно ожидать от суммирования двух полиномов: вы можете получить результат в его упрощенной форме:
[(7,0),(4,1),(8,2)]
Еще один комментарий: вы узнали о Haskell синтаксис записи ? Я думаю, что это может упростить вашу работу и прояснить ситуацию. Вот подсказка:
data Term = Term { coeff :: Int,
expnt :: Int
} deriving Show
data Pol = Pol { terms :: [Term] } deriving Show
При этом суммирование двух многочленов без упрощения результата так же просто, как ... объединение их терминов :) ... и все наглядно:
Main> let p1 = Pol [Term 5 0, Term 1 1, Term 7 2]
Main> p1
Pol {terms = [Term {coeff = 5, expnt = 0},Term {coeff = 1, expnt = 1},Term {coeff = 7, expnt = 2}]}
Main> let p2 = Pol [Term 1 2, Term 3 1, Term 2 0]
Main> p2
Pol {terms = [Term {coeff = 1, expnt = 2},Term {coeff = 3, expnt = 1},Term {coeff = 2, expnt = 0}]}
Main> let p3 = sumpol p1 p2
Main> p3
Pol {terms = [Term {coeff = 5, expnt = 0},Term {coeff = 1, expnt = 1},Term {coeff = 7, expnt = 2},Term {coeff = 1, expnt = 2},Term {coeff = 3, expnt = 1},Term {coeff = 2, expnt = 0}]}
Упрощение полинома немного сложнее, но хорошее упражнение.
Надеюсь, это поможет.