5 votes

Haskell, Même si mon type n'est pas spécifié, j'obtiens cette erreur : Couldn't match type `a' with `[a]', `a' is a rigid type variable bound by

Je me rends compte que cette question peut faire double emploi, car un certain nombre de ces erreurs ont été signalées sur Stack Overflow, mais aucune des solutions ne semble s'appliquer à mon problème.

J'ai donc la fonction suivante :

elementAt' :: Integral b => [a] -> b -> a
elementAt' [x:_] 1 = x
elementAt' [x:xs] y = elementAt' xs yminus1
    where yminus1 = y - 1

Au cas où vous vous poseriez la question, il s'agit du problème n°3 de 99 problèmes en Haskell . Le but de la fonction est de prendre en entrée une liste et un index, et de retourner la valeur à cet index (en commençant par 1). Je ne veux pas de solution au problème, sinon je pourrais simplement regarder celles fournies. Mais je reçois une erreur que je ne comprends pas. J'utilise eclipseFP, le plugin eclipse pour haskell et il souligne les portions "[x:_]" et "[x:xs]" de la fonction avec l'erreur suivante :

Couldn't match type `a' with `[a]'
`a' is a rigid type variable bound by
the type signature for elementAt' :: Integral b => [a] -> b -> a

Dans tous les fils de discussion sur cette erreur que j'ai consultés, le problème se produit généralement lorsque quelqu'un essaie de donner une sortie incorrecte à quelque chose qui attend un certain type. Par exemple, renvoyer la longueur de quelque chose (qui est de type Int) à ce qui devrait être un type de variable "Num a".

Mais dans mon cas, je ne donne même pas de type pour la variable a. Elle devrait pouvoir être N'IMPORTE QUOI, non ? Alors pourquoi est-ce que j'obtiens cette erreur ? Si je comprenais pourquoi j'obtiens cette erreur, je pourrais la corriger, mais je ne comprends pas.

Quelqu'un pourrait-il m'expliquer pourquoi je reçois cette erreur ?

Votre aide est très appréciée, merci. -Asaf

Edit : Toutes les réponses fournies jusqu'à présent sont correctes, merci à tous pour les informations utiles. Je vais choisir celle qui me semble la plus claire (je dois cependant attendre 5 minutes pour le faire).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X