Questions / réponses

Prefixe/suffixe tests non valide

Prefixe/suffixe tests non valide

napisao/la Nicolas Dieryck -
Broj odgovora: 2

Bonjour,

je pense que mon code est bon mais je ne cesse d'obtenir :

--------------------------------
Error: This expression has type int list
but an expression was expected of type 'a list list
Type int is not compatible with type 'a list
--------------------------------
0/100

Et pour le coup, je ne comprends pas pourquoi..

Est ce que les tests sont à jour ?

Cordialement

Odgovor na Nicolas Dieryck

Re: Prefixe/suffixe tests non valide

napisao/la Marc Zeitoun -

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 osmijeh).

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.


Odgovor na Nicolas Dieryck

Re: Prefixe/suffixe tests non valide

napisao/la Philippe Duchon -

Pour compléter la réponse de Marc...

L'analyseur de types d'Ocaml est performant, mais il ne détaille pas son "raisonnement" dans ses messages d'erreur...

Essayons un peu de pas à pas:

* puisque le paramètre acc de la fonction aux peut prendre la valeur [], acc doit être d'un type de liste ('a list)

* puisqu'on utilise l'opérateur de concaténation @ entre acc et t, t doit aussi être de type 'a list

* comme t est obtenu comme tête de la liste l, l doit être de type 'a list list


D'où le type inféré pour la fonction prefix: 'a list list -> int -> 'a list (enfin il manque certaines étapes; le type de n est inféré à partir de la comparaison de n avec 0 (donc c'est un int) et le type de retour est inféré par le fait qu'il doit être le même que celui de acc)


Je soupçonne que dans votre tête, t n'est pas forcément une liste (c'est le type des éléments de la liste dont on veut un préfixe, après tout). Mais alors, vous ne devriez pas essayer de le concaténer avec acc, qui est une liste...