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 :

[débutant] Pattern matching avec un n-uplet


Sujet :

Caml

  1. #1
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut [débutant] Pattern matching avec un n-uplet
    Salut encore,

    je ne vois pas comment faire pour faire du pattern matching avec des n-uplets, toutes mes tentatives se sont soldées par des échecs.

    Avec les liste, rien de plus simple, mais avec les n-uplets:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    match e with
    (a*b*c) -> ...
    Ca marche pas...

    Merci de votre aide.

  2. #2
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Pour détruire une valeur (avec un pattern) on utilise presque la même syntaxe que pour le construire, donc un pattern pour un n-uplet ressemble à :
    --
    Jedaï

  3. #3
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Merci!

    Ca marche!

  4. #4
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Et comme pour contruire (et contrairement à Haskell), les parenthèses sont optionnelles.

  5. #5
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Merci, je ne savais pas.

  6. #6
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Points : 64
    Points
    64
    Par défaut
    C'est en plus, mais ça peut souvent être pratique : le patern matching implicite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    let f a b c = (a+b, b+c, a+c) in
    let g a b c =
      let (x,y,_) = f a b c in
      (x,y)
    Une fonction f qui renvoit un triplet, et dans la fonction g on appel la fonction f et on match x avec la premiere composante, on match y avec la seconde composante, et on laisse tomber la troisieme composante.
    Ca marche aussi pour les listes etc.

    Dans une moindre mesure on peut peut-être aussi pousser le vice à parler de patern matching implicite pour des cas comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    let x = (1, 2, 3) in
    let f (a, b, _) = (a, b) in
    f x
    Ici on a une fonction qui prend un triplet, et on match a avec la premiere composante, b avec la seconde, et on laisse tomber la troisieme, et on renvoit un couple ne contenant que les deux premiere composante, et on aplique cette fonction au triplet x.

    derniere exemple : une fonction qui prend une liste en argument dont il existe au moins 2 élément.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    let f e1::e2::tail = (e1, e2)
    in f [1, 2, 3, 4]
    voilà une fonction f qui match l'élément obligatoire avec e1, le second élément obligatoire avec e2, et le reste de la liste (peut être la liste vide) avec tail, et renvoit le couple des deux premiers éléments de la liste.

  7. #7
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Merci!!

    Je ne savais pas du tout qu'on pouvait directement distinguer les arguments d'une fonction en listes, n-uplets, etc.

    Je pensais que dans certains cas on était obligé de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let foo = function
        (a, b, c) -> ...
    ;;
    Alors que grâce à toi je sais qu'on peut faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let foo (a, b, c) =
      ...
    ;;
    J'ai aussi appris le pattern matching implicite, en effet dans certains cas je n'ai pas besoin de nommer tous les éléments d'un n-uplets.

    Donc un grand merci pour ces informations (là je crois que je peux avancer vers la partie suivante en toute sécurité )

    Merci à vous tous, grâce à vous l'apprentissage de ce langage est encore plus rapide et facile

  8. #8
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Points : 64
    Points
    64
    Par défaut
    Moi aussi quand j'ai découvert ça, ça a changé ma vie. Avant je m'emmerdais à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    let v = f x in
      let a = fst v
      and b = snd v in
        ...
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    let (a,b) = f x in
      ...

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    derniere exemple : une fonction qui prend une liste en argument dont il existe au moins 2 élément.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    let f e1::e2::tail = (e1, e2)
    in f [1, 2, 3, 4]
    voilà une fonction f qui match l'élément obligatoire avec e1, le second élément obligatoire avec e2, et le reste de la liste (peut être la liste vide) avec tail, et renvoit le couple des deux premiers éléments de la liste.
    Attention cependant, cette fonction est incomplète, renvoie une exception quand on l'appelle avec des listes de moins de deux éléments, et à priori renvoie un warning à la compilation. C'est généralement considéré comme du "mauvais style" (même si pour ma part je ne trouve pas ça si vilain, d'autres gens pourraient ne pas trop apprécier).

    Quand on fait un matching "incomplet" (qui peut échouer), il vaut sans doute mieux le préciser explicitement.

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

Discussions similaires

  1. pattern matching avec boost graph
    Par makrouna dans le forum Boost
    Réponses: 2
    Dernier message: 30/07/2011, 01h56
  2. Réponses: 1
    Dernier message: 05/06/2009, 11h48
  3. [Débutant][Phppgadmin] problème avec les types
    Par PoY dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/08/2004, 18h06
  4. Réponses: 5
    Dernier message: 19/08/2004, 12h11
  5. [Débutant][Applet] Communication avec Servlet - IO Exception
    Par gandalf_le_blanc dans le forum Applets
    Réponses: 35
    Dernier message: 16/04/2004, 14h29

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