[OCAML] Couple de liste

Modérateur : Michel Quercia

Répondre
Manymelo
Messages : 2
Enregistré le : sam. avr. 27, 2019 4:38 pm
Classe : License 1

[OCAML] Couple de liste

Message par Manymelo » sam. avr. 27, 2019 4:46 pm

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.

Avatar du membre
MinAloye
Messages : 493
Enregistré le : jeu. juin 08, 2017 9:39 pm
Classe : Moi j'joue à Albion

Re: [OCAML] Couple de liste

Message par MinAloye » sam. avr. 27, 2019 6:59 pm

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;;
PS : c'est bête de s'être fait chier pour voir que t'avais perdu :)

YS1
Messages : 68
Enregistré le : dim. févr. 06, 2005 12:50 pm
Classe : MPSI, PCSI, MP*, PC*

Re: [OCAML] Couple de liste

Message par YS1 » dim. avr. 28, 2019 2:28 pm

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;;

Manymelo
Messages : 2
Enregistré le : sam. avr. 27, 2019 4:38 pm
Classe : License 1

Re: [OCAML] Couple de liste

Message par Manymelo » lun. avr. 29, 2019 3:16 am

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

Répondre

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 5 invités