Bonjour tout le monde,
Je prend aujourd'hui mon plus beau clavier car je bute sur une erreur classique, j'ai nommé:
Pour me présenter brièvement, j'ai eu la chance de toucher du doigt la programmation fonctionnelle à la fac lors de mes cours (à base de Caml Light) il y'a environs 10 ans de celà. Aujourd'hui je me replonge un peu dans mes cours de fac (parce que je viens de passer pas mal d'annéesThis expression has type 'a, but is used with type 'a list.à faire du Javaà oublier tout ce que je savais) et notamment je suis en train de refaire un TD et je bloque un peu.
Je ne sais pas si c'est une coquille dans mon code qui m'échappe ou si c'est une erreur dans la logique mais je viens de passer un peu trop de temps à mon gout à chercher l'erreur. Aussi, je viens à vous en espérant qu'une bonne âme saura me sortir de mon désarroi.
Sans plus d'ambages, je vous présente le code qui me cause tant de tourments:
A quoi mon interpréteur Caml Light favoris répond:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 let trouve_personnes annuaire f = let max = (vect_length annuaire) - 1 in let rec aux annuaire f i res = if i > max then res else match f annuaire.(i) with true -> aux annuaire f (i+1) annuaire.(i)::res | false -> aux annuaire f (i+1) res in aux annuaire f 0 [];;
Cette fonction est simplement sensé parcourir un vecteur et renvoyer une liste de tous les éléments du vecteur qui répondent true à une fonction d'évaluation (un peu comme la fonction filter des listes OCaml).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Toplevel input: > | false -> aux annuaire f (i+1) res in > ^^^^^^^^^^^^^^^^^^^^^^^^ This expression has type 'a, but is used with type 'a list.
Je ne comprends pas comment il en arrive à estimer que aux annuaire f (i+1) res est de type 'a, je m'attendais en effet qu'il soit de type 'a list.
Je suis donc preneur de toute explication en ce sens.
De plus, j'ai le sentiment que ce code n'est pas très beau et ne colle pas vraiment à ce que ferait un codeur ML. Je suis donc également preneur de conseil quant à la façon d'implémenter une telle fonction de manière élégante.
Bien à vous.
Edit: après une bonne nuit de sommeil j'espérai m'en tirer mieux avec une liste en entrée plutôt qu'un vecteur mais en fait non, c'est donc bien une erreur de logique de mon code qui m'échappe. J'ai réecrit le code suivant:
mais j'ai la même erreur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 let list_filter l f = let rec aux l r = match l with [] -> r | h::t -> if (f h) then (aux l h::r) else (aux l r) in aux l [];;
pourtant le seul cas terminal de ma fonction récursive est '[] -> r', qui explicite bien que 'aux' retourne 'r' et 'r' est une liste, puisque j'utilise l'expression 'aux l h::r'. Je ne comprend pas pourquoi il estime que 'aux l r' est de type 'a.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 > | h::t -> if (f h) then (aux l h::r) else (aux l r) in > ^^^^^^^ This expression has type 'a, but is used with type 'a list.
Bien à vous.
Partager