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] extraire les valeurs trois par 3 d'une liste par filtrage


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] extraire les valeurs trois par 3 d'une liste par filtrage
    Bonjour,

    mon soucis est le suivant : j'ai une liste d'int, je veux récupérér une liste de triplets de valeurs. par exemple, si j'ai la liste :
    [1;2;3;4;5;6] je voudrais obtenir :

    [(1,2,3);(4,5,6)].

    je prends la tete avec cette connerie et je ne m'en sort pas du tout .
    j'ai essayer ces pistes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     let rec list_to_point list = 
           let convert a = match a with 
         [x;y;z]->(x,y,z)
          | _ -> (0,0,0) in
        match list with
           | x::fin -> convert x :: list_to_point fin
           | []     -> [];;
    j'ai fait tout plein de tests de ce genre dans tous les sens mais jamais il ne passe de int list a int*int*int list , est-ce que vous pourriez m'expliquer ce que je fais mal s'i vous plait ?

  2. #2
    Membre averti
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Points : 330
    Points
    330
    Par défaut
    Bonjour,

    Un petit détail pour commencer, ta fonction convert ne dépend pas de list, inutile donc de la définir à l'intérieur de list_to_point, sinon est elle est reconstruite à chaque fois.

    Le problème est que tu définis convert comme prenant une liste, et ensuite tu appelles convert avec une tête de liste, le compilateur en déduit donc que list est une liste de listes.

    Tu veux plutôt quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    let rec list_to_point list = match list with
      | x::y::z::reste -> (x,y,z)::(list_to_point reste)
      | _ -> []
    ;;
    J'ai pas essayé.

  3. #3
    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
    Citation Envoyé par Strab
    Bonjour,

    Un petit détail pour commencer, ta fonction convert ne dépend pas de list, inutile donc de la définir à l'intérieur de list_to_point, sinon est elle est reconstruite à chaque fois.

    Le problème est que tu définis convert comme prenant une liste, et ensuite tu appelles convert avec une tête de liste, le compilateur en déduit donc que list est une liste de listes.

    Tu veux plutôt quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    let rec list_to_point list = match list with
      | x::y::z::reste -> (x,y,z)::(list_to_point reste)
      | _ -> []
    ;;
    J'ai pas essayé.
    merci mon bon seigneur, ce que tu proposes la, c'est ce que je CROYAIS avori essayé en tout premier, ce qui em paraissait le plus logique et le plus simple.
    Cependant, ca n'avait pas marché j'obtenais du 'a list -> 'a liste .. et pour cause j'avais mis des ; a la place des ,

    MERCI beaucoup infirniment !!!!

  4. #4
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     let rec list_to_point list = 
           let convert a = match a with 
         [x;y;z]->(x,y,z)
          | _ -> (0,0,0) in
        match list with
           | x::fin -> convert x :: list_to_point fin
           | []     -> [];;
    Tu fais ce que tu veux mais par expérience je te conseille de bien parenthèser et présenter ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    let rec list_to_point list = 
      let convert a = match a with 
        | x :: y :: z :: [] -> (x, y, z)
        | _ -> (0,0,0) in
     
      match list with
        | x :: fin -> (convert x) :: (list_to_point fin)
        | [] -> []

  5. #5
    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
    Citation Envoyé par InOCamlWeTrust
    Tu fais ce que tu veux mais par expérience je te conseille de bien parenthèser et présenter ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    let rec list_to_point list = 
      let convert a = match a with 
        | x :: y :: z :: [] -> (x, y, z)
        | _ -> (0,0,0) in
     
      match list with
        | x :: fin -> (convert x) :: (list_to_point fin)
        | [] -> []

    tu as entièrement raison en plus d'êtr evite illisible ca provoque parfois des effets bizarres lorsque comme moi tu ne maitrises pas bien les priorités d'évaluation du langage du genre :
    SOit F1 une fonction qui prend 1 argument de type A
    Soit F2 une fonction qui prend 1 argument de type B et renvoit un type A
    Soit V une valeur de type C, parfois,

    F1 F2 V provoque un "fonction called with too many arguments sur F1" ce qui n'arrive jamais avec
    F1 (F2 V)

  6. #6
    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
    Citation Envoyé par cladsam
    parfois,
    F1 F2 V provoque un "fonction called with too many arguments sur F1" ce qui n'arrive jamais avec
    F1 (F2 V)
    Si F1 est une fonction de type * -> *, on ne parle pas de "parfois", mais de "toujours". En Haskell remarque tu peux écrire ça comme ça :
    Où $ est un opérateur infixe d'application, mais qui a une priorité moindre que l'application de fonction, ce qui évite donc d'avoir à mettre plein de parenthèses. Parfois il ressemble presque à un "pipe inversé" sur certaines lignes où il est présent à répétition. J'aime assez personnellement, ça évite l'embrouillamini de parenthèses, et c'est très lisible.

    --
    Jedaï

  7. #7
    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
    Je sais que je me répète, mais je veux marteller cette idée : la syntaxe Caml est beaucoup trop conflictuelle comme pour pouvoir écrire les choses légèrement... à celà s'ajoute le fait que l'analyse syntaxique est du type LaLR, ce qui peut provoquer des résultats surprenants (du genre on te dit que l'erreur est à la ligne 150 alors que le problème provient de la ligne 12... ça m'est déjà arrivé, et j'ai failli perdre tous mes cheveux !).

    Le parser Objective Caml contient, je crois de mémoire, une soixantaine de conflits, dont trente Shift-Reduce et trente Reduce-Reduce... et pour Caml Light, c'est pire ! Seule la personne qui a écrit le parser (c'est-à-dire Xavier Leroy) peut utiliser une syntaxe allègée... et les autres de la Caml Team, aussi...

    Si tu veux voir comment pouvoir écrire du Caml léger, tu peux utiliser Camlp4 : il suffit que tu prennes un de tes fichiers, n'importe lequel, et que tu fasses, de mémoire...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    camlp4 pa_o.cmo pr_o.cmo fichier.ml

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

Discussions similaires

  1. récupérer les valeurs d'un checkbox dans une liste
    Par ikouhan dans le forum Struts 1
    Réponses: 19
    Dernier message: 31/08/2010, 15h22
  2. Créer une feuille par élément d'une liste.
    Par Lucci dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/07/2008, 21h54
  3. Réponses: 2
    Dernier message: 29/06/2008, 20h16
  4. Réponses: 2
    Dernier message: 26/05/2007, 18h28
  5. [MySQL] Organiser les valeurs de 2 tables dans une liste de sélection
    Par domdas dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 12/08/2006, 09h51

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