[OCAML] Couple de liste

Messages : 0

Inscription : 27 avr. 2019 16:38

Profil de l'utilisateur : Élève de lycée

[OCAML] Couple de liste

Message par Manymelo » 27 avr. 2019 16:46

Bonjour, depuis hier je bute sur une question de mon exercice sur ocaml (je suis débutant en L1) et cela me frustre.
Voici la question :

3°/ Écrire une fonction booléenne publiable dont l’argument x est un élément de type
t_article et qui vérifie que deux relecteurs ont conseillé l’acceptation de l’article.

Avec au préalable défini,
#type t_eval = |ENA |ACC |REV |REF;;
#type t_article = {titre : string; auteur : string ; relecture : (string*t_eval) list}

J'ai pensé à créer une fonction qui compte le nombre de fois ou le type t_eval ACC apparait dans la liste mais je bloque.
Voici mon idée, let rec compte x = match x.relecture with |[] -> 0 |h::t -> if h = (je ne sais pas quoi mettre ici,ACC) then 1 + compte t else compte t;;

let publiable x = if compte x >= 2 then true else false;;

Si vous avez des pistes pour m'aider, je suis preneur Merci.

Messages : 0

Inscription : 08 juin 2017 21:39

Profil de l'utilisateur : Élève de lycée

Re: [OCAML] Couple de liste

Message par MinAloye » 27 avr. 2019 18:59

Salut,

Déjà, même si il n'y avait pas ce problème ta fonction ne marcherait pas à cause des types : ton argument x est un article (puisque tu observes son évaluation) mais dans ton filtrage, tu lances compte sur une (string*t_eval) list : ça ne peut pas fonctionner. Je te laisse corriger ça tout seul, les fonctions qui suivent présentent la même erreur.
Et pense, même si indenter c'est chiant sur un forum, à au moins écrire tes fonctions sur plusieurs lignes.

Pour revenir à ton problème : Tu pourrais peut-être modifier ton filtrage, ou utiliser des alias.

Par exemple (solution) :
SPOILER:
Le plus simple serait de modifier ton filtrage en découpant à cette étape ta tête de liste (le nom "relecteur" peut être remplacé par _ pour ne pas le stocker en mémoire) :

Code : Tout sélectionner

let rec compte x = match x.relecture with 
	|[] -> 0 
	|(relecteur,evaluation)::t -> 	if evaluation = ACC then 
						1 + compte t 
					else compte t;;
En plus, ça te permettrait de faire le test directement dans le filtrage et d'obtenir une fonction plus élégante :

Code : Tout sélectionner

let rec compte x = match x.relecture with 
	|[] -> 0 
	|(_,evaluation)::t when evaluation=ACC -> 1 + compte t 
	|h::t -> compte t;;

YS1

Messages : 13

Inscription : 06 févr. 2005 11:50

Profil de l'utilisateur : Enseignant (CPGE)

Re: [OCAML] Couple de liste

Message par YS1 » 28 avr. 2019 14:28

Voire même, puisqu'on a un type construit :
SPOILER:

Code : Tout sélectionner

let rec compte x = match x.relecture with 
	|[] -> 0 
	|(_,ACC)::t -> 1 + compte t 
	|h::t -> compte t;;

Messages : 0

Inscription : 27 avr. 2019 16:38

Profil de l'utilisateur : Élève de lycée

Re: [OCAML] Couple de liste

Message par Manymelo » 29 avr. 2019 03:16

Effectivement je me suis aperçu de mes erreurs et j’ai compris, je te remercie infiniment tu m’as grandement aidé

Répondre