Précédent   Forum du club des développeurs et IT Pro > Autres langages > Langages fonctionnels > Caml
Caml Forum d'entraide sur la programmation avec les langages fonctionnels Caml-Light et OCaml
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 14/06/2012, 16h43   #1
trylam
Invité de passage
 
Femme
Étudiant
Inscription : juin 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2012
Messages : 6
Points : 1
Points : 1
Par défaut Liste de carte

Bonjour,

je commence à peine en caml mais j'ai un problème.
J'ai un type couleur, un type figure et un type carte composé du type couleur et figure.
Ensuite j'ai une liste de carte.
Et donc mon problème : je ne sais pas comment accéder à la couleur d'une carte qui se trouve dans la liste.

Ca doit être tout simple mais je n'y arrive pas...

Merci pour votre aide!
trylam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2012, 18h34   #2
Ptival
Membre actif
 
Avatar de Ptival
 
Homme Valentin Robert
Étudiant
Inscription : juin 2004
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Valentin Robert
Âge : 24
Localisation : Etats-Unis

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2004
Messages : 70
Points : 172
Points : 172
Il va nous falloir les définitions.

Si :
Code :
type carte = MkCarte of (couleur * figure)
alors :
Code :
let MkCarte(c_couleur, _) = c in (* ... *)
ou :
Code :
match c with MkCarte(c_couleur, _) -> (* ... *)
Si :
Code :
1
2
3
4
type carte =
  { couleur : couleur
  ; figure : figure
  }
alors :
Ptival est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2012, 19h07   #3
trylam
Invité de passage
 
Femme
Étudiant
Inscription : juin 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2012
Messages : 6
Points : 1
Points : 1
Merci.

En fait j'ai ça :

Code :
1
2
3
4
5
type carte =
  { couleur : couleur
  ; figure : figure
  }
Et je dois écrire une fonction qui prend en paramètre en liste de carte et une couleur et qui renvoie le nombre de cartes de la liste qui sont de cette couleur alors j'ai fait :

Code :
1
2
3
4
5
let rec nbcoul (l, coul)=
  if l=[ ] then 0
  else if List.hd(l).couleur = coul then 1+nbcoul (List.tl(l), coul) 
  else nbcoul(List.tl(l), coul);;
et le problème en fait c'est qu'il ne reconnait pas que c'est une liste de carte
trylam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2012, 07h46   #4
Ptival
Membre actif
 
Avatar de Ptival
 
Homme Valentin Robert
Étudiant
Inscription : juin 2004
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Valentin Robert
Âge : 24
Localisation : Etats-Unis

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2004
Messages : 70
Points : 172
Points : 172
Voilà comment on écrirait cela en OCaml légèrement plus idiomatique :

Code :
1
2
3
4
5
let rec nbcoul l coul =
  match l with
  | [] -> 0
  | h::t when h.couleur = coul -> 1 + nbcoul t coul
  | _::t -> nbcoul t coul
Remarques :
- pas besoin de mettre les paramètres d'une fonction dans une paire ;
- pour regarder la forme d'un type de données, on utilise le filtrage par motifs (des motifs qui sont regardés de haut en bas, et le premier qui correspond à la valeur en entrée déclenche l'évaluation du code après son "->") ;
- pour en plus tester une condition, j'ai ici utilisé une clause "when condition" ;
- pas besoin de ";;" si tu écris ça dans un fichier.

On peut même rendre le code plus générique :

Code :
1
2
3
4
5
6
7
let rec count_sat cond l =
  match l with
  | [] -> 0
  | h::t when cond h -> 1 + count_sat cond t
  | _::t -> count_sat cond t

let nbcoul l coul = count_sat (fun c -> c.couleur = coul) l
Puis on peut utiliser des fonctions d'ordre supérieur pour éviter d'écrire ça à la main, mais tu verras sûrement ça plus tard.
Ptival est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2012, 11h05   #5
trylam
Invité de passage
 
Femme
Étudiant
Inscription : juin 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2012
Messages : 6
Points : 1
Points : 1
Impec, je te remercie, tu me dépannes bien.
trylam est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h01.


 
 
 
 
Partenaires

Hébergement Web