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 :

[Caml] Je ne connais pas le Caml, pourriez-vous me traduire ce bout de code ?


Sujet :

Caml

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 30
    Par défaut [Caml] Je ne connais pas le Caml, pourriez-vous me traduire ce bout de code ?
    Bonsoir

    Voici mon problème : j'ai un bout de code en Caml qui doit me servir à coder une fonction... mais je ne connais pas le Caml !
    Le morceau de code n'étant vraiment pas long, je me suis dit que je trouverais bien qqun ici pour m'aider à le traduire... (en algo pure, ou à la limite en C, en Pascal, ...)
    Voici le code en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    let enumere p =
      let t = make_vect (p+1) [] in
      t.(0) <- [[|1;-1|]];
      for k=1 to p do
         for i=0 to k-1 do t.(k) <- t.(k)@fusion (t.(i)) (t.(k-1-i))
         done
      done;
      t;;
    A noter que "fusion" est une fonction définie plus haut, qui accepte 2 paramètres.
    En gros, ce que je comprends :
    - on a à faire à une procédure "enumere", qui admet un paramètre p (qui est un réel, ça je le sais)
    - elle remplit un tableau (ça je le sais aussi ) t, de p+1 éléments
    - t[0] : je comprends pas ce qu'on met dedans...
    - on a 2 boucles imbriquées, je comprends la syntaxe du for... mais que signifie : t.(k) <- t.(k)@fusion (t.(i)) (t.(k-1-i)) ??
    J'ai lu qqpart que @ était un opérateur de concaténation... mais je comprends pas trop...


    Merci d'avance de votre aide

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Citation Envoyé par Dunk
    - t[0] : je comprends pas ce qu'on met dedans...
    [|1;-1|] est un tableau d'entier contenant 1 et -1
    [[|1;-1|]] est une liste contenant un seul élément: un tableau d'entier contenant 1 et -1


    Citation Envoyé par Dunk
    mais que signifie : t.(k) <- t.(k)@fusion (t.(i)) (t.(k-1-i)) ??
    En fait, il doit manquer des parenthèses:
    t.(k) <- t.(k)@( fusion (t.(i)) (t.(k-1-i)) )

    Vu que t.(k) = [] (la liste vide), cela revient à faire directement :
    t.(k) <- fusion (t.(i)) (t.(k-1-i))

    Après, c'est facile à comprendre... (ça ressemble à n'importe quel langage impératif)

    Sinon, elle est censée faire quoi la fonction fusion?
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par pcaboche
    Vu que t.(k) = [] (la liste vide), cela revient à faire directement :
    t.(k) <- fusion (t.(i)) (t.(k-1-i))
    t.(k) n'est pas toujours égal à la liste vide ! Par ailleurs sans fusion() il est difficile de déterminer ce que fait ce code.

    --
    Jedaï

  4. #4
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 30
    Par défaut
    Je comprends bien, mais ça va être relativement compliqué à expliquer, étant donné que c'est une fonction très spécifique au programme en question.
    En gros, fusion est une fonction qui admet comme paramètres 2 listes et qui renvoie une 3e liste formée à partir de combinaisons d'éléments des 2 premières...

    Autre question : y a-t-il des pointeurs en Caml ? est-ce qu'il y a une analogie possible entre l'utilisation des pointeurs pour les listes en Pascal et les listes de Caml ?

  5. #5
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Citation Envoyé par Dunk
    Autre question : y a-t-il des pointeurs en Caml ?
    On appelle ça des références.


    Citation Envoyé par Dunk
    est-ce qu'il y a une analogie possible entre l'utilisation des pointeurs pour les listes en Pascal et les listes de Caml ?
    Il y a longtemps que je n'ai pas fait de Pascal. Ce que tu cherches à faire, c'est un itérateur sur la liste, c'est bien cela? Je ne sais pas si cela existe.

    Indépendemment de cela, il est assez maladroit en Caml de vouloir reproduire ce que l'on a l'habitude de faire dans des programmes impératifs comme C ou Pascal. Surtout au début (un fois que tu as un peu d'expérience, tu fais ce qui te semble le mieux). Caml est avant tout un langage fonctionnel et les fonctions sont programmées récursivement.

    Pour appliquer une fonction à tous les éléments d'une liste, on utilisera list__map:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list__map lafonction liste
    Au fait, tu utilise camllight ou ocaml? c'est un projet universitaire ou autre?
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Citation Envoyé par Jedai
    t.(k) n'est pas toujours égal à la liste vide !
    J'ai l'impression que si: au départ, on créé une liste avec make_vect ne contenant que []. Ensuite on change t.(0) en [|1;-1|], puis on prend k=1. De par le parcours du tableau, à tout moment du programme, pour tout i1 tel que i1<k, t.(i1) != [], et pour tout i2 tel que k=<i2, t(i2)=[]. Par conséquent, à tout moment du programme on a t.(k)=[].
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  7. #7
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par pcaboche
    J'ai l'impression que si: au départ, on créé une liste avec make_vect ne contenant que []. Ensuite on change t.(0) en [|1;-1|], puis on prend k=1. De par le parcours du tableau, à tout moment du programme, pour tout i1 tel que i1<k, t.(i1) != [], et pour tout i2 tel que k=<i2, t(i2)=[]. Par conséquent, à tout moment du programme on a t.(k)=[].
    Prenons k = 2, et supposons que si l'une des deux listes est non vide, fusion() renvoie une liste non vide. Tu est d'accord que quand k = 2, t.(0) et t.(1) sont non vide ? Lorsque i = 0, on met donc t.(2)@(fusion t.(0) t.(...)) dans t.(2), donc t.(2) n'est plus vide lorsqu'on arrive à i = 1... J'ai l'impression que tu avais oublié la boucle interne dans ton raisonnement ?

    --
    Jedaï

  8. #8
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Oui, tu as raison Jedai. Ca me parait tellement pas naturel de faire de l'itératif en Caml que j'avais pas vu qu'on réécrivait toujours dans la même case du tableau.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

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

Discussions similaires

  1. [VBA-E] Je ne connais pas grand chose VBA + Excel
    Par nicolasdeloise dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 17/01/2007, 22h58
  2. Chercher un fichier dont je ne connais pas l'extension
    Par Poussy-Puce dans le forum ASP
    Réponses: 3
    Dernier message: 06/06/2006, 17h16
  3. Une classes dont je ne connais pas le nom :(
    Par Fy_Hertz dans le forum Windows
    Réponses: 10
    Dernier message: 16/01/2006, 12h33

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