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 :

[OCaml][Débutant] Filtrage de motif sur des listes


Sujet :

Caml

  1. #1
    Rédacteur
    Avatar de cladsam
    Profil pro
    Inscrit en
    Août 2003
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2003
    Messages : 1 785
    Points : 2 436
    Points
    2 436
    Par défaut [OCaml][Débutant] Filtrage de motif sur des listes
    Bonjour,

    j'essaie de faire un exercice "simple" de cours et je n'y parviens pas.
    Le but est d'utiliser le filtrage de motifs pour créer une fonction f qui prend 2 paramètres, un liste d'int et un int et renvoit la même liste privée du 2 ème paramètre :

    ex : f [2,3,4,7] 4 -> [2,3,7]

    j'ai donc pensé après moultes essais à ceci :
    Code ocaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    let rec f l x = match l with
               [] -> []
              |[x]::q -> f q x
              |[a]::r  -> [a]:: f r x;;

    Ca ne marche pas.
    Je ne comprends pas pourquoi il a du mal a digérer cela et ce que je voudrais c'est que l'on m'explique mon erreur de raisonnement (SVP ne me donnez PAS la solution, je veux juste comprendre).

    Merci de votre aide précieuse

  2. #2
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    C'est une erreur très classique : le filtrage n'est pas un filtrage de valeurs, mais un filtrage de motifs.

    Lorsque tu écris...

    ... x est un motif, ici le premier élément de la liste paramètre, et il n'est en aucun cas comparé à la valeur de ton deuxième argument, x. Pour celà, tu peux écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    let rec f l x = match l with
        | [] -> []
        | tete :: queue when tete = x -> queue
        | tete :: queue -> tete :: (f queue x)
    Autre chose : si on ne travaille pas sous la boucle d'intéraction, les ;; sont obsolètes... et il vaudrait mieux les éviter dans les fichiers source.

  3. #3
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Citation Envoyé par cladsam
    Code ocaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    let rec f l x = match l with
               [] -> []
              |[x]::q -> f q x
              |[a]::r  -> [a]:: f r x;;
    Il y a aussi une chose que tu n'a pas comprise : une liste, par exemple [ 1; 2; 3; 4 ], peut s'écrire de façon classique, mais aussi comme ceci 1 :: 2 :: 3 :: 4 :: [], ou encore 1 :: [ 2; 3; 4 ], ou 1 :: 2 :: [ 3; 4 ], etc... et ça se filtre donc de cette façon-là.

    L'opérateur :: prend comme argument gauche un élément et comme argument droit une liste : 1 :: 2 :: [ 3; 4 ] est donc 1 :: (2 :: [ 3; 4 ]). En syntaxe révisée, on écrirait celà de façon un peu différente, certes pratique parce qu'elle n'introduit aucune ambigüité, mais mieux vaut ne pas en faire usage, du moins au début.

  4. #4
    Rédacteur
    Avatar de cladsam
    Profil pro
    Inscrit en
    Août 2003
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2003
    Messages : 1 785
    Points : 2 436
    Points
    2 436
    Par défaut
    Merci de ton aide, le code suivant fonctionne mais je ne le comprends pas pour autant.
    Citation Envoyé par InOCamlWeTrust

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    let rec f l x = match l with
        | [] -> []
        | tete :: queue when tete = x -> queue
        | tete :: queue -> tete :: (f queue x)
    je comprends la dernière ligne, je crois comprendre ce qui se passe dans la 2eme mais ce qui me parait bizarre c'est que l'on écrive :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     x -> queue la ou je voyais x -> f queue x
    ???

  5. #5
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    En effet, la fonction donnée par InOCamlWeTrust ne supprime pas tous les éléments mais seulement le premier qu'il trouve. Pour régler ça, il faut faire un appel à f :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    let rec f l x = match l with
        | [] -> []
        | tete :: queue when tete = x -> f queue x
        | tete :: queue -> tete :: (f queue x)
    On peut mieux faire, mais ça devrait fonctionner.

  6. #6
    Rédacteur
    Avatar de cladsam
    Profil pro
    Inscrit en
    Août 2003
    Messages
    1 785
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2003
    Messages : 1 785
    Points : 2 436
    Points
    2 436
    Par défaut
    ok je viens de comprendre
    Super maintenant je vais pouvoir m'exercer en cherchant d'autres trucs à résoudre .
    merci

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

Discussions similaires

  1. Optimiser un filtrage multiple sur des listes.
    Par PauseKawa dans le forum Général Python
    Réponses: 31
    Dernier message: 16/09/2009, 17h22
  2. pb sur des listes à 2 dimensions
    Par gerard tarquin dans le forum Général Python
    Réponses: 4
    Dernier message: 24/05/2007, 13h05
  3. Liste d'iterateur sur des listes.
    Par jobherzt dans le forum C++
    Réponses: 5
    Dernier message: 24/11/2006, 15h06
  4. Problème de rafraîchissement de post sur des listes
    Par Greggggggg dans le forum Langage
    Réponses: 7
    Dernier message: 21/08/2006, 15h32
  5. [Javascript] Question pas difficile sur des listes dynamique...
    Par mulbek dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/04/2006, 10h55

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