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 :

probleme de typage dans des listes , débutant


Sujet :

Caml

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 49
    Points : 34
    Points
    34
    Par défaut probleme de typage dans des listes , débutant
    Bonjour,

    Voila mon code sachant que la fonction longueur est défini avant et fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    let rec prod_scal l1 l2=
    if (longueur l1 != longueur l2) 
    then failwith "erreur"
    else
    	match (l1,l2) with
    	(x::[],y::[])->x*y
    	|(x::[r],y::[t])->x*y+prod_scal r t;;
    et voila le retour terminal:

    This expression has type int list -> int list -> int,
    but is used with type int -> int -> int.
    Surement un probleme de syntaxe , mais après avoir essayer plusieurs changements sans améliorations , je sèche...

    Je fais donc appel à vos lumières.
    Merci.

  2. #2
    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
    Le message d'erreur dit que tu mélanges des entiers (int) et des listes d'entiers. Tu n'as aucune idée de l'endroit de ton programme où tu aurais pu te tromper ?

    (Indice : quel est le type de "r" et "t" ?)

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 49
    Points : 34
    Points
    34
    Par défaut
    quel est le type de "r" et "t" ?
    Et bien , r et t sont type int list , il s'agit du reste de la liste après les éléments x et y.
    Je les passes en paramètres de prod_scal (int list->int list->int).Mais le programme à l'air de considérer que :
    1.soit l1 l2 sont des int
    2.soit r et t sont des int
    3.soit l1 l2 r et t sont des int

    Je pense que le probleme est dans le 2.Mais
    Tu n'as aucune idée de l'endroit de ton programme où tu aurais pu te tromper ?
    Eh bien malheuresement non , même s'il doit s'agir d'un truc tout bête, il y visiblement un petit quelque chose que j'ai pas capter...

  4. #4
    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
    quand tu écris `x::[r]`, tu composes deux motifs :
    - truc::machin qui correspond à "une liste dont le premier élément correspond à truc, et la suite correspond à machin"
    - [bidule] qui correspond à "une liste à un seul élément, bidule" (et plus généralement le motif "[bidule; chouette; chose]" pour une liste à trois éléments, etc.)

    x::[r] correspond donc à une liste à deux éléments, où on nomme x le premier et r le deuxième. Ce n'est pas ce que tu veux.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 49
    Points : 34
    Points
    34
    Par défaut
    Mais oui bien sur...
    J'étais bloquer sur mon idée que [r] était le reste de la liste...
    C'est pas glorieux tout ça...
    Enfin bref voilà le code corrigé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let rec prod_scal l1 l2=
    if (longueur l1 != longueur l2) 
    then failwith "erreur"
    else
    	match (l1,l2) with
    	(x::[],y::[])->x*y
    	|(x::r,y::t)->x*y+(prod_scal r t);;
    Merci pour ton aide.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 933
    Points
    933
    Par défaut
    Citation Envoyé par Freedom57 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let rec prod_scal l1 l2=
    if (longueur l1 != longueur l2) 
    then failwith "erreur"
    else
    	match (l1,l2) with
    	(x::[],y::[])->x*y
    	|(x::r,y::t)->x*y+(prod_scal r t);;
    Normalement, tu as un warning de pattern non exhaustif, avec un exemple (je parie sur ([], [])). Et il est fortement conseillé de résoudre les warnings ! Surtout que là il te parle d'un cas auquel tu n'a pas pensé, puisque la liste vide a la même longueur que la liste vide, mais que tu ne traites pas ce cas !

    D'après toi, quel est la complexité de ta fonction ? Pour te faire une idée, essaye de la "dérouler" sur deux liste de longueur 3, en le faisant bien, étape par étape. Est ce que tu as des tests redondant (effectués plusieurs fois, sans raison) ? Je te laisse chercher un peu

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 49
    Points : 34
    Points
    34
    Par défaut
    @ tropMDR

    Est ce que tu veux parler d'un code comme ça?:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    let prod_scal l1 l2=
    if (longueur l1 = longueur l2)&&(l1!=[]) 
    then let rec parcours l1 l2=
    	 match (l1,l2) with
    	(x::[],y::[])->x*y
    	|(x::r,y::t)->x*y+(parcours r t)
    	|_->failwith "Juste pour enlever le warning mais il n'y a pas de raison que ce message s'affiche puisque l1 et l2 ne seront jamais vide dans ce filtrage"
    	in parcours l1 l2
    else failwith "erreur";;
    Merci.

  8. #8
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonsoir,

    @Freedom57 : ton code reste assez confus, et de là vient probablement une grande partie des problèmes que tu rencontres. La condition de départ, avec le calcul de la longueur d'une liste standard d'OCaml, est très peu idiomatique de caml. Il faut en effet parcourir la liste, ce qui est coûteux. De plus, ta fonction auxiliaire parcours est un cas particulier de la fonction List.fold_left2, qui peut être mise à profit pour simplifier considérablement ton code. Un équivalent non testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let prod_scal = function
      | [] -> (fun _ -> failwith "Liste vide")
      | l1 -> (function
        | [] -> failwith "Liste vide"
        | l2 -> List.fold_left2 (fun res x y -> x * y + res) 0 l1 l2)
    Cordialement,
    Cacophrène

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/03/2007, 18h08
  2. probleme de selection dans une liste deroulant
    Par biboulou dans le forum IHM
    Réponses: 5
    Dernier message: 04/05/2006, 12h16
  3. Présentation dans des listes imbriquées
    Par Ghusse dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 29/09/2005, 09h35
  4. [langage] probleme avec les listes dans des listes
    Par pqmoltonel dans le forum Langage
    Réponses: 7
    Dernier message: 27/04/2004, 12h32
  5. [LG]probleme d'ajout dans une liste chainée...
    Par misteryann dans le forum Langage
    Réponses: 5
    Dernier message: 08/03/2004, 20h28

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