/ / Comment ajouter des comparaisons d'égalité (==) à un nouveau type dans Haskell - haskell, typeclass, newtype

Comment ajouter des comparaisons d'égalité (==) à un nouveau type dans Haskell - haskell, typeclass, newtype

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 № 1

Le 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.