Haskell: Aucune instance pour (Eq a) résultant de l'utilisation de `== '
isPalindrome :: [a] -> Bool
isPalindrome xs = case xs of
[] -> True
[x] -> True
a -> (last a) == (head a) && (isPalindrome (drop 1 (take (length a - 1) a)))
main = do
print (show (isPalindrome "blaho"))
résultats dans
No instance for (Eq a)
arising from a use of `=='
In the first argument of `(&&)', namely `(last a) == (head a)'
In the expression:
(last a) == (head a)
&& (isPalindrome (drop 1 (take (length a - 1) a)))
In a case alternative:
a -> (last a) == (head a)
&& (isPalindrome (drop 1 (take (length a - 1) a)))
Pourquoi est-ce que cette erreur se produise?
source d'informationauteur Muhd
Vous devez vous connecter pour publier un commentaire.
Vous êtes à la comparaison de deux éléments de type
a
à l'aide de==
. Cela signifie quea
ne peut pas être de tout type, il doit être une instance deEq
comme le type de==
est(==) :: Eq a => a -> a -> Bool
.Vous pouvez résoudre ce problème en ajoutant une
Eq
contrainte sura
le type de signature de votre fonction:Par le façon, il ya un moyen beaucoup plus simple à mettre en œuvre cette fonction à l'aide
reverse
.hammar est la bonne explication.
Un autre exemple simple:
(E==x) échoue pour cette fonction de signature. Vous devez remplacer:
l'ajout d'un Eq exemple, pour une
Cette instanciation est dire que maintenant, un a un type qui peut être comparable avec et e==x) ne manquera pas.