Page 1 sur 1

[OCAML] Couple de liste

Posté : sam. avr. 27, 2019 4:46 pm
par Manymelo
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.

Re: [OCAML] Couple de liste

Posté : sam. avr. 27, 2019 6:59 pm
par MinAloye
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;;

Re: [OCAML] Couple de liste

Posté : dim. avr. 28, 2019 2:28 pm
par YS1
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;;

Re: [OCAML] Couple de liste

Posté : lun. avr. 29, 2019 3:16 am
par Manymelo
Effectivement je me suis aperçu de mes erreurs et j’ai compris, je te remercie infiniment tu m’as grandement aidé