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 :

Un problème de type [Débutant(e)]


Sujet :

Caml

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Un problème de type
    Bonjour tout le monde,

    Je prend aujourd'hui mon plus beau clavier car je bute sur une erreur classique, j'ai nommé:
    This expression has type 'a, but is used with type 'a list.
    Pour me présenter brièvement, j'ai eu la chance de toucher du doigt la programmation fonctionnelle à la fac lors de mes cours (à base de Caml Light) il y'a environs 10 ans de celà. Aujourd'hui je me replonge un peu dans mes cours de fac (parce que je viens de passer pas mal d'années à faire du Java à oublier tout ce que je savais) et notamment je suis en train de refaire un TD et je bloque un peu.

    Je ne sais pas si c'est une coquille dans mon code qui m'échappe ou si c'est une erreur dans la logique mais je viens de passer un peu trop de temps à mon gout à chercher l'erreur. Aussi, je viens à vous en espérant qu'une bonne âme saura me sortir de mon désarroi.

    Sans plus d'ambages, je vous présente le code qui me cause tant de tourments:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    let trouve_personnes annuaire f =
      let max = (vect_length annuaire) - 1 in
      let rec aux annuaire f i res = 
        if i > max then res else
          match f annuaire.(i) with
            true -> aux annuaire f (i+1) annuaire.(i)::res
            | false -> aux annuaire f (i+1) res in
      aux annuaire f 0 [];;
    A quoi mon interpréteur Caml Light favoris répond:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Toplevel input:
    >        | false -> aux annuaire f (i+1) res in
    >                   ^^^^^^^^^^^^^^^^^^^^^^^^
    This expression has type 'a,
    but is used with type 'a list.
    Cette fonction est simplement sensé parcourir un vecteur et renvoyer une liste de tous les éléments du vecteur qui répondent true à une fonction d'évaluation (un peu comme la fonction filter des listes OCaml).

    Je ne comprends pas comment il en arrive à estimer que aux annuaire f (i+1) res est de type 'a, je m'attendais en effet qu'il soit de type 'a list.
    Je suis donc preneur de toute explication en ce sens.

    De plus, j'ai le sentiment que ce code n'est pas très beau et ne colle pas vraiment à ce que ferait un codeur ML. Je suis donc également preneur de conseil quant à la façon d'implémenter une telle fonction de manière élégante.

    Bien à vous.

    Edit: après une bonne nuit de sommeil j'espérai m'en tirer mieux avec une liste en entrée plutôt qu'un vecteur mais en fait non, c'est donc bien une erreur de logique de mon code qui m'échappe. J'ai réecrit le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    let list_filter l f =
      let rec aux l r = match l with
        [] -> r
        | h::t -> if (f h) then (aux l h::r) else (aux l r) in
      aux l [];;
    mais j'ai la même erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    >    | h::t -> if (f h) then (aux l h::r) else (aux l r) in
    >                                               ^^^^^^^
    This expression has type 'a,
    but is used with type 'a list.
    pourtant le seul cas terminal de ma fonction récursive est '[] -> r', qui explicite bien que 'aux' retourne 'r' et 'r' est une liste, puisque j'utilise l'expression 'aux l h::r'. Je ne comprend pas pourquoi il estime que 'aux l r' est de type 'a.
    Bien à vous.

  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 991
    Points
    2 991
    Par défaut
    Caml regarde d'abord la branche then avant de regarder la branche else.

    Or ta branche then vaut (aux l h::r) que Caml comprend comme (aux l h)::r et non pas comme aux l (h::r).

    Indice : aux l (h::r) n'est pas non plus la bonne réponse, même si ça type correctement.
    Car aux l signifie que tu fais une boucle infinie.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Hmm, je comprend mieux.
    Merci beaucoup, avec cette piste j'ai réussis à m'en sortir (a grand coup de parenthèses).
    Moi qui croyait que c'était une spécificité de Lisp ...

    Du coup j'ai finis mon TD, au suivant!

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

Discussions similaires

  1. [ tinyint et char ] problème de type
    Par shirya dans le forum Installation
    Réponses: 3
    Dernier message: 05/11/2005, 08h08
  2. [debutant] problème avec type à utiliser
    Par mlequim dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 15/07/2005, 17h08
  3. Problème de type chaîne
    Par champijulie dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 12/05/2005, 21h23
  4. Réponses: 4
    Dernier message: 30/01/2005, 15h23
  5. [Sybase] Problème de type sous ASE
    Par Hotchotte dans le forum Sybase
    Réponses: 1
    Dernier message: 18/12/2004, 12h04

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