IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

Parcourir un type Ocaml


Sujet :

Caml

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Parcourir un type Ocaml
    Bonjour, dans le cadre d'un projet scolaire je dois réaliser des figures graphiques en Ocaml à l'aide de L-systems donnés.
    On nous imposes d'utiliser les types suivants :
    Symboles :Le type symbol représente un symbole — vous pouvez utiliser un type algébrique, une chaîne, ou un caractère.

    Chaînes parenthésées
    Le type bracketed représente l’arbre de syntaxe d’une chaîne parenthésée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    type bracketed = S of symbol
    | Seq of bracketed list
    | Branch of bracketed list;;
    Le constructeur
    Seq
    représente une séquence ordinaire, tandis que le constructeur
    Branch
    représente une séquence entre crochets. Par exemple, si
    f et p
    sont des variables de type symbol la chaîne F[P[PF]F] peut être représentée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Seq [(S f);
    Branch [(S p);
    Branch [(S p); (S f)];
    (S f)]]
    La difficulté que je rencontre et que je n'arrive pas à parcourir ce type Bracketed pour avoir un élement voulu par exemple je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let x = Seq[(S f);(S m);(S p)];;
    List.hd x;; (* renvoie une erreur disant This expression has Type Bracketed  but an expression was expected of type 'a list *)
    Mais comme défini dans le type Brackted Seq est une liste de Brackted donc une 'a list , non?
    Donc pourquoi ne peut-on pas la traiter comme une liste?
    Et sinon comment parcourir un a un les éléments d'un type bracketed ?
    PS: ce que j'essaye de faire c'est de parcourir un Bracketed qui represente une génération de L-system afin de pouvoir générer la prochaine génération.

  2. #2
    Membre régulier
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    102
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 102
    Points : 110
    Points
    110
    Par défaut
    Salut,

    Regarde le type et la valeur de x. Normalement tu devrais avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    val x : bracketed = Seq [S f; S m; S p]
    Ce qui est différent de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    val x : bracketed = [S f; S m; S p]
    Donc en gros tu penses appliquer la fonction List.hd sur [S f; S m; S p] mais en réalité tu l'appliques sur Seq [S f; S m; S p], qui n'est pas une liste !

    Essaie un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    match x with
    | Seq (h :: t) -> h
    ...
    Mais n'oublie pas de dire ce qui doit se passer dans les autres cas. Ton code devrait donc ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    match x with
    | Seq (h :: t) -> h
    | Seq [] -> ???
    | Branch (h :: t) -> ???
    | Branch [] -> ???
    | S s -> ???
    Et ce qui est bien c'est que j'ai pu écrire tout ça juste en lisant la définition de ton type, sans même regarder ce que tu essayais de faire ! (du coup vu que je sais pas ce que tu veux faire peut-être que tu peux regrouper des cas, ou à l'inverse être plus discriminant, je n'en sais rien)

    Si tout ce qui est écrit plus haut te semble bizarre, lis la doc sur le pattern-matching, c'est un truc super utile ! D'ailleurs, quand tu peux, essaie d'éviter d'utiliser List.hd, car ça t'oblige à catcher l'exception lorsque la liste est vide (à moins que tu ne sois SUR du fait qu'elle ne le sera jamais...). La construction précédente est donc à la fois plus élégante et plus sûre

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Exactement si tu veux accéder a l’intérieur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    match x with
    |Seq(list)-> (*fais ce que tu veux avec le contenu*)
    Attention , ton type Branch devrait être Branch of bracketed (*tout court , une parenthésé contient qu'une chose , mémé si cette chose est une liste*)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [9i] Parcourir un tableau dont l'index est de type VARCHAR2
    Par weejungle dans le forum PL/SQL
    Réponses: 3
    Dernier message: 14/09/2013, 16h32
  2. Créer un bouton de type "Parcourir"
    Par dessinateurttuyen dans le forum Langage
    Réponses: 11
    Dernier message: 18/08/2006, 13h38
  3. [VB.NET]Parcourir un certain type de controle d'1 formulaire
    Par NicolasJolet dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/02/2006, 13h09
  4. Choisir le type de fichier à "Parcourir..."
    Par Bissada dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 22/11/2005, 13h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo