Я пытаюсь определить новый тип под названием «Poly» в Haskell, где тип представляет собой список «Num», представляющий полиномиальное выражение. [1,2,3] соответствует 3x^2 + 2x + 1, поэтому [4,5,6,0,0...0] — это тот же полином, что и [4,5,6].
Я создал вспомогательную функцию под названием «chop», чтобы удалить 0 с конца списка, но у меня возникли проблемы со сравнением двух списков. Любые идеи, почему мое использование «экземпляра» здесь не работает?
Компилируется, но при попытке сравнить 2 экземпляра Poly WinGHCi зависает.
newtype Poly a = P [a]
x :: Num a => Poly a
chop :: (Eq a, Num a) => Poly a -> Poly a
chop (P l) = if (last l) == 0 then chop (P $ init l) else P l
instance (Num a, Eq a) => Eq (Poly a) where
(==) m n = if (chop m) == (chop n) then True else False
if e then True else False
эквивалентен простоe
. - person chi   schedule 29.04.2015chop
имеет квадратичную сложность, это можно сделать за линейное время O(n). - person Franky   schedule 29.04.2015