J'essaie de définir un nouveau type appelé "Poly" dansHaskell, où le type est une liste de "Num" représentant une expression polynomiale. [1,2,3] correspond à 3x ^ 2 + 2x + 1, donc [4,5,6,0,0 ... 0] est donc le même polynôme que [4,5,6].
J'ai créé une fonction d'aide appelée "hacher" pour supprimer 0 "de la fin de la liste, mais j'ai du mal à comparer deux listes. Des idées pourquoi mon utilisation de" instance "ne fonctionne pas ici?
Il se compile, mais lorsque vous essayez de comparer 2 instances de Poly, WinGHCi se bloque.
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
Réponses:
8 pour la réponse № 1Le problème est que vous avez défini (==)
être récursif sur lui-même. Simplifiant un peu votre définition, vous avez:
m == n = chop m == chop n
Cela évalue ainsi:
m == n
-> { definition of (==) }
chop m == chop n
-> { definition of (==) }
chop (chop m) == chop (chop n)
-> { definition of (==) }
chop (chop (chop m)) == chop (chop (chop n))
-> { ... }
Au lieu de renvoyer votre test d'égalité vers le test d'égalité pour les polynômes, vous devez répartir vers l'égalité pour les listes. Par exemple, on pourrait écrire
m == n = let P m" = chop m; P n" = chop n in m" == n"
au lieu.