Je suis nouveau chez Haskell. J'ai écrit ce code:Impossible de déduire (Eq a) du contexte (...)
deleteDuplicates :: [a] -> [a]
deleteDuplicates [] = []
deleteDuplicates (x:xs)
| x == (head xs) = x : (deleteDuplicates (tail xs))
| otherwise = x : (head xs) : (deleteDuplicates (tail xs))
Qu'est-ce que cette erreur signifie et pourquoi cela s'est-il produit? Est-ce que je compare accidentellement deux types différents en quelque sorte?
set2.hs:10:3:
Could not deduce (Eq a) from the context()
arising from a use of `==' at set2.hs:10:3-16
Possible fix:
add (Eq a) to the context of
the type signature for `deleteDuplicates'
In the expression: x == (head xs)
In a stmt of a pattern guard for
the definition of `deleteDuplicates':
x == (head xs)
In the definition of `deleteDuplicates':
deleteDuplicates (x : xs)
| x == (head xs) = x : (deleteDuplicates (tail xs))
| otherwise = x : (head xs) : (deleteDuplicates (tail xs))
Vous avez complètement raison à propos de quelque chose comme '[1, 2, 2, 3]' ne produisant pas une liste avec tous les doublons supprimés. Ma faute. Le 'Eq a =>' est nouveau pour moi ... donc la seule chose qui fait est de faire en sorte que les éléments de type 'a' soient comparables? – Pieter
Pieter: Fondamentalement, oui. C'est une "contrainte de classe de type". La fonction '==' est déclarée dans la classe de type 'Eq', donc elle ne peut être utilisée que sur les instances de Eq. –
@Pieter: comparable pour l'égalité, oui. 'Eq a =>' dit que 'a' doit être une instance de la classe' Eq'. Une classe de type spécifie une interface que l'instance implémente.La classe 'Eq' fournit deux fonctions,' (==) 'et' (/ =) ', toutes deux avec le type' a -> a -> Bool'. D'autres classes de types fourniront d'autres fonctions, par exemple 'Ord' fournit des tests de classement inférieurs, supérieurs et similaires. –