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] type incohérent


Sujet :

Caml

  1. #1
    Membre actif Avatar de dragonfly
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 464
    Points : 240
    Points
    240
    Par défaut [ocaml] type incohérent
    Bonjour à tous, c'est encore moi ^^

    Je viens vers vous car j'ai deux fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    let dims mat =
      let n = Array.length mat in
      if n = 0 then (0, 0) else (n, Array.length mat.(0));;
     
    let recup_pt_traj m =
       let rec loop_mat i j lis =
    	 let liste = (if m(i).(j)==3 then (i,j)::lis else lis) in
    	 let dim = dims m in
        match () with
    	  |() when i=fst(dim) && j=snd(dim) -> liste
          |() when i=fst(dim) -> loop_mat 0 (j+1) liste
          |() when j=snd(dim) -> loop_mat (i+1) 0 liste
          |() -> loop_mat (i+1) j liste in
        loop_mat 0 0 [];;
    Le probléme c'est que lorsque je veux compiler la fonction 'recup_pt_traj', j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Characters 128-129:
      	 let dim = dims m in
                       ^
    Error: This expression has type 'a -> int
           but an expression was expected of type 'b array array
    Je ne comprends vraiment pas pourquoi il attend le type 'b array array.
    C'est du au fait que dans le let plus haut je manipule une matrice ? Le if serait inadapté?
    Quand j'enléve le in , j'ai cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Characters 358-360:
          loop_mat 0 0 [] ;; 
                               ^^
    Error: Syntax error
    Que la je ne comprends pas du tout...

    Si quelqu'un a une idée, je prends

  2. #2
    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
    Moi aussi j'utilise des tabulations et malheureusement ça n'aide pas ocaml à bien situer l'expression qui déclenche le message d'erreur. Si tu n'avais utilisé que des espaces le ^ aurait désigné m.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    let dim = dims m in
                   ^
    Error: This expression has type 'a -> int
           but an expression was expected of type 'b array array
    Pour ce qui est de la cause.
    Le fait est qu'à la ligne 8 tu as écrit m(i).(j) alors que tu songeais à m.(i).(j).

    Maintenant tu me diras : oui mais comment je pouvais trouver cette coquille tout seul
    La réponse est simple : on te dit que m doit être de type 'b array array.
    Hé bien tu peux expliciter cette contrainte dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # let recup_pt_traj (m:'b array array) =
         let rec loop_mat i j lis =
          let liste = (if m(i).(j)==3 then (i,j)::lis else lis) in
          let dim = dims m in
          match () with
            |() when i=fst(dim) && j=snd(dim) -> liste
            |() when i=fst(dim) -> loop_mat 0 (j+1) liste
            |() when j=snd(dim) -> loop_mat (i+1) 0 liste
            |() -> loop_mat (i+1) j liste in
          loop_mat 0 0 [];;
    Characters 89-90:
          let liste = (if m(i).(j)==3 then (i,j)::lis else lis) in
                          ^
    Error: This expression is not a function; it cannot be applied
    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.

  3. #3
    Membre actif Avatar de dragonfly
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    464
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 464
    Points : 240
    Points
    240
    Par défaut
    Salut,

    non c'est pas ocaml, c'est lorsque j'ai copié le code dans la balise dans dvp qu'il y avait un décalage, je l'ai corrigé et j'aurai pas du (à la base l'erreur s'affiche bien sur le 'm').

    Pour l'erreur, j'ai honte c'est le truc qui saute au yeux ^^.

    A l'avenir, je veillerai à analyser les erreurs de typage plus profondément pour détecter moi même ce type d'erreur.

    Encore merci, ca compile nickel (après si le code fonctionne, faut que je teste mais ça c'est mon problème après ^^)

    P.S : La prochaine fois que je viendrais (je pense revenir, je débute ^^), je checkerai les erreurs "simples" avant.

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

Discussions similaires

  1. Ocaml: types paramétrés
    Par christina03 dans le forum Caml
    Réponses: 9
    Dernier message: 21/06/2011, 19h55
  2. Réponses: 3
    Dernier message: 30/08/2010, 11h34
  3. Réponses: 3
    Dernier message: 23/05/2006, 15h09
  4. types de données incohérents
    Par afaraji dans le forum Oracle
    Réponses: 4
    Dernier message: 22/12/2005, 13h52
  5. [requête] Incohérence de type
    Par Virgile59 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 03/11/2005, 13h43

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