Bonsoir,
Merci de poser la question sur le forum, ça le fait vivre. Les tests sont à jour (et corrects, a priori : un paquet Haribo au choix pour qui trouve une erreur
).
Lorsqu'on évalue le code,
let prefix l n = let rec aux l n acc =
if n <= 0 then acc else
match l with
[] -> acc
|t::q -> aux q (n-1) (acc@t)
in aux l n []
on obtient comme type
prefix : 'a list list -> int -> 'a list
ce qui est suspect, car prefix doit prendre en premier argument une liste, et pas une liste de listes. Le type est incorrect, la fonction doit être aussi incorrecte.
Le problème est la valeur de retour : aux q (n-1) (acc@t). Il y a une confusion entre :: et @.
L'opérateur :: ajoute un *élément* en tête de liste. L'opérateur @ concatène (colle) deux *listes*.
Donc,
- comme t apparaît à droite de @ dans (acc@t), t doit est une liste,
- comme l est "matchée" avec t::q, son premier élément, t, est une liste, donc l est une liste de listes.
Retourner aux q (n-1) (t :: acc) donne presque le bon résultat, à tester.
---------
Rappel pour tou.te.s :
Le mieux est de développer sous OCaml avec l'environnement que vous préférez (Emacs, Atom, Sublimetext...) mais *** pas *** sous Moodle. Il faut prendre le temps de lire les messages d'erreur, de les analyser, et d'avoir un retour de l'interpréteur OCaml.