Besoin d'aide en CamL

Résolu/Fermé
delfre56 Messages postés 340 Date d'inscription mardi 3 juillet 2012 Statut Membre Dernière intervention 23 février 2018 - 16 nov. 2014 à 18:53
delfre56 Messages postés 340 Date d'inscription mardi 3 juillet 2012 Statut Membre Dernière intervention 23 février 2018 - 16 nov. 2014 à 19:54
Bonjour,
Je suis étudiant en première année de licence en informatique et notre prof de programmation nous fait travailler sur CamL (oui, je sais...)
toujours est-il que je bloque sur un programme qui sert à retourner une liste.

let l2 = [] in
let rec reverse(l) = if est_seq_vide(l) then l2
else ajout_debut(premier(l),l2), reverse(reste(l);;

est_seq_vide(l) permet de savoir si une liste l est vide ou pas, ajout_debut(a,l) ajoute un élément a au début d'une liste l et premier(l) isole le premier élément d'une liste.
Ma question est simple : j'aimerais, comme vous pouvez le voir, que ma section "else" fasse deux choses en même temps, à la fois faire ajout_debut(premier(l),l2) et à la fois reverse(reste(l) (algorithme réccursif azi tavu)
Bref, mettre une virgule comme je l'ai fait ne semble pas suffir, CamL me renvoie une erreur syntaxe sur... Les ;; à la fin --' Si quelqu'un s'y connait un peu en CamL et est capable de me dire comment faire pour qur mes deux trucs se fassent en même temps, je suis preneur :)
Merci d'avance pour vos réponses !

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 16/11/2014 à 19:14
Bonjour,

"comment faire pour qur mes deux trucs se fassent en même temps"
Tu devrais utiliser une structure begin/end.

let rec reverse l =
if (est_seq_vide l)
then l2
else begin
ajout_debut ((premier l), l2);
reverse (reste l);
end;;

Remarque : en Caml on utilise plutôt le paradigme fonctionnel, donc les structures if/then/else sont généralement à bannir, car elles sont issus du paradigme impératif.
En fonctionnel, il faudrait plutôt utiliser des structures de pattern matching. Exemple :

let rec reverse = function
| [] -> []
| a::b -> (reverse b)@[a];;

reverse [1; 2; 3; 4; 5];;
La confiance n'exclut pas le contrôle
0
delfre56 Messages postés 340 Date d'inscription mardi 3 juillet 2012 Statut Membre Dernière intervention 23 février 2018 48
16 nov. 2014 à 19:54
Merci beaucoup ! Par contre pour la deuxième partie tu es rentré dans des trucs que je ne sais pas faire, on commence tout juste à voir ce que c'est que le patern matching, alors un truc comme ça... o0
0