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] problème de types


Sujet :

Caml

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut [OCaml] problème de types
    Bonjour,

    Actuellement en école d'ingénieur, je dois rendre un projet dans une semaine, mais j'ai un problème avec une fonction et je ne comprends pas pourquoi Caml me donne ce message d'erreur :

    en fait on rentre un 'a (il s'agit d'un pays) et une liste de couples ('a*'a list) (ces couples sont en fait des pays frontaliers) et il faut que la fonction ressorte un couple de liste : d'un côté les pays supprimés et de l'aute les pays non supprimés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let rec supprime5 (a,l) = match l with
       [] -> ([],[])
      |(e1,e2)::r -> 
          let (_::r1,_::r2) = supprime5 (a,r) in 
          if e1=a then (supprime5 (a,r1), e1::r2) 
                  else if e2=a then (supprime5 (a,r1), e2::r2)
                                else (e1::e2::r1, supprime5 (a,r2));;

    Voilà ce que Caml renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    This expression has type ('a * 'a) list but is here used with type 'a list.

    Merci beaucoup

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    ce morceau n'a pas le bon type

    faudrait pas plutot ceci ?

    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    en fait, si je mets ça, ça va renvoyer une liste avec des couples et c'est pas ce qu je veux
    mais j'ai essayé et Caml répond ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    This expression has type 'a * 'a list but is here used with type
      'a * ('a * 'a) list
     
         |(e1,e2)::r -> let (_::r1,_::r2) = supprime5 (a,r) in if e1=a then (supprime5 (a,r1), e1::r2) else 
                            ^^^^^^^^^^^^^
    Characters 338-344:
                                                               else ((e1,e2),r1, supprime5 (a,r2));;
                                                                                           ^^^^^^

  4. #4
    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
    Ce bout de code est nettement faux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let (_::r1,_::r2) = supprime5 (a,r)
    puisque r pourrait être vide, et donc le pattern matching pourrait échouer.

    A mon avis ton problème vient du fait que tu n'as pas assez formalisé ta question : essaie de formuler clairement ce que tu veux faire (donne un exemple simple), et nous pourrons mieux t'aider (il est même possible que la formulation claire du problème suffise à te donner la solution, c'est courant).

    --
    Jedaï

  5. #5
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # let rec partition a l =
      match l with
      | [] -> ([],[])
      | (e1,e2)::r -> 
           let (r1,r2) = partition a r in 
           if e1=a then (r1,e2::r2) 
           else if e2=a then (r1,e1::r2)
           else (e1::e2::r1,r2);;
    val partition : 'a -> ('a * 'a) list -> 'a list * 'a list = <fun>
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    merci bcp pr ce code, je vais essater de voir avec mon prjets et mes tests si tout fonctionne

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    ceci dit , amdettons qu'on est ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    partition ("fr",[("fr","be"); ("be","pb"); ("pb","all"); ("all","po"); ("po","rt"); ("rt","au"); ("au","su"); ("su","it"); ("it","fr"); ("fr","su")]);;
    et caml renvoie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    - : string list * string list =
    (["be"; "pb"; "pb"; "all"; "all"; "po"; "po"; "rt"; "rt"; "au"; "au"; "su";
      "su"; "it"; "fr"], ["fr"; "fr"; "fr"])
    ds la 1ère liste, on ne devrait pas avoir "fr" :s

    je rappelle juste le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     let rec partition (a,l) = match l with 
    [] -> ([a],[])
       | (e1,e2)::r -> let (r1,r2) = partition (a,r) in if e1=a then (r1, (e1::r2)) else
                                                        if e2=a then (r1,(e2::r2))
                                                        else (e1::e2::r1, r2);;

Discussions similaires

  1. Problème de type avec fonction OCAML
    Par chrislains dans le forum Caml
    Réponses: 1
    Dernier message: 12/05/2013, 15h44
  2. Problèmes de type en Ocaml
    Par clement1010 dans le forum Caml
    Réponses: 3
    Dernier message: 13/11/2011, 17h02
  3. [OCaml] Problème de structure/parser
    Par marv1 dans le forum Caml
    Réponses: 4
    Dernier message: 09/05/2005, 12h16
  4. Réponses: 4
    Dernier message: 30/01/2005, 14h23
  5. [Sybase] Problème de type sous ASE
    Par Hotchotte dans le forum Sybase
    Réponses: 1
    Dernier message: 18/12/2004, 11h04

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