Я пытаюсь определить новый тип, называемый «Poly» в Haskell, где type представляет собой список «Num», представляющий полиномиальное выражение. [1,2,3] соответствует 3x^2 + 2x + 1, поэтому [4,5,6,0,0 ... 0] - тот же полином, что и [4,5,6].Как добавить сравнения сравнений (==) в newtype в Haskell
Я создал вспомогательную функцию, называемую «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'. – chi
BTW 'chop' имеет квадратичную сложность, это можно сделать в линейном времени _O (n) _. – Franky