Je suis en train de compiler la fonction suivante dans Haskell pour imiter la différenciation d'un polynôme dont les constantes sont spécifiées dans une liste numérique:Pourquoi Haskell interprète-t-il mon type Num comme Enum?
diff :: (Num a) => [a] -> [a]
diff [] = error "Polynomial unspecified"
diff coeff = zipWith (*) (tail coeff) [0..]
Haskell refuse de le compiler, me donner la raison suivante:
Could not deduce (Enum a) from the context (Num a)
arising from the arithmetic sequence `0 .. ' at fp1.hs:7:38-42
Possible fix:
add (Enum a) to the context of the type signature for `diff'
In the third argument of `zipWith', namely `[0 .. ]'
In the expression: zipWith (*) (tail coeff) ([0 .. ])
In the definition of `diff':
diff coeff = zipWith (*) (tail coeff) ([0 .. ])
Pourquoi Haskell traite-t-il la liste [0..]
comme un type Enum et comment puis-je résoudre ce problème. Gardez à l'esprit que je veux profiter de l'évaluation paresseuse ici, d'où la liste infinie.
Est-ce que 'diff [] = []' ou 'diff [_] = [0]' ne serait pas meilleur? Après tout, prendre le quatrième différentiel de x^2 + 1 devrait être une constante 0, pas une erreur. – ephemient
@ephemient: Vous êtes aux yeux d'aigle! J'ai pris soin de l'exception de la liste singleton après avoir posté le problème. Le code devrait aussi lire '[1 ..]' plutôt que '[0 ..]' pour qu'il se différencie correctement. – Zaid