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 - Classes et Objets


Sujet :

Caml

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 5
    Points : 8
    Points
    8
    Par défaut Ocaml - Classes et Objets
    Bonjour à tous,

    Supposons que j'ai les 2 classes suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      class  client (n : string) (d :int) =
      object
        val nom = n
        val demande = d
        method get_nom = nom 
        method get_demande = demande
      end
    ET

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      class itineraire =  
      let num = ref 1 in
        fun (c : int) ->
      object(this)
        val numero = !num  
        val capacite = c
        val mutable demande_totale = 0 
        val mutable liste_clients : client list = []
        method get_numero = numero
        method get_demande_totale = demande_totale
        method get_liste_clients = liste_clients
        method set_demande_totale (d : int) = demande_totale <- d
        method set_liste_clients  (l : client list) = liste_clients <- l
      end
    J'aimerais ajouter une méthode à la classe itinéraire qui calculerait la demande totale des clients d'un itinéraire. La signature de cette méthode doit correspondre à "method calculer_demandeTotale : int"
    Voici ce que j'ai pour le moment:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    method calculer_demandeTotale  =  this#set_demande_totale (fold_right (+) (map (fun x -> x#get_demande) liste_clients) 0)
    Malheureusement, cela produit l'erreur suivante dans Ocaml:
    Error: This expression has type client list but is here used with type
    < get_demande : 'a; .. > array
    Je ne la comprends pas

    Quelqu'un pourrait m'éclairer sur la bonne façon de faire ce que je veux??

    Merci à l'avance

  2. #2
    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
    Bonjour,

    Ne jamais faire open Array ou open List dans un code... je suppose que c'est ton cas puisque les appels à fold_right et map ne sont précédés d'aucun nom de module. Ça pollue l'espace de noms et, dans le cas présent, provoque une erreur car List.fold_right est masquée par Array.fold_right. Ce code fonctionne (parties importantes en vert) :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    class client (n : string) (d :int) =
      object
        val nom = n
        val demande = d
        method get_nom = nom
        method get_demande = demande
      end
    
    class itineraire =
      let num = ref 1 in
      fun (c : int) ->
      object(this)
        val numero = !num
        val capacite = c
        val mutable demande_totale = 0
        val mutable liste_clients : client list = []
        method get_numero = numero
        method get_demande_totale = demande_totale
        method get_liste_clients = liste_clients
        method set_demande_totale (d : int) = demande_totale <- d
        method set_liste_clients (l : client list) = liste_clients <- l
        method calculer_demandeTotale () = this#set_demande_totale (List.fold_right (+) (List.map (fun x -> x#get_demande) liste_clients) 0)
      end 
    Attention aussi à la signature de calculer_demandeTotale qui est unit -> unit et non int, avec le code que tu nous donnes (en fait c'est unit, mais on préfère ajouter un argument de type unit quand l'appel de la méthode fait un effet de bord, ce qui donne bien unit -> unit). Enfin, fold_right précédé de map équivaut à fold_right seul et, en règle générale, on préfère utiliser fold_left, surtout sur des listes (déjà détaillé ailleurs sur le forum). Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    method calculer_demandeTotale () =
      this#set_demande_totale (
        List.fold_left (fun res client -> 
          res + client#get_demande
        ) 0 liste_clients
      )
    Pour conclure ce long message, une remarque de style : le mélange du français et de l'anglais dans les noms, comme le mélange des conventions (underscore ou majuscule, cf. calculer_demandeTotale) c'est pas du plus bel effet.

    Cordialement,
    Cacophrène

  3. #3
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Citation Envoyé par Cacophrene Voir le message
    calculer_demandeTotale qui est unit -> unit et non int, avec le code que tu nous donnes (en fait c'est unit, mais on préfère ajouter un argument de type unit quand l'appel de la méthode fait un effet de bord, ce qui donne bien unit -> unit).
    Pour une méthode, ça ne sert à rien d'ajouter un argument de type unit. Autant l'abandonner, ça allègera le code.

  4. #4
    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
    Bonjour,

    Citation Envoyé par LLB
    Pour une méthode, ça ne sert à rien d'ajouter un argument de type unit. Autant l'abandonner, ça allègera le code.
    D'accord pour dire que ça ne sert à rien dans le cas des méthodes, mais pas d'accord pour l'enlever. C'est une convention courante dans des bibliothèques qui utilisent beaucoup les objets, notamment LablGTK. Elle permet d'expliciter la présence d'un effet de bord. Et ça permet de garder la continuité avec ce qui se passe sans les objets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let x = ()
    let hello () = print_endline "Hello world!"
    Cordialement,
    Cacophrène

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

Discussions similaires

  1. [POO] Classe et objet: besoin d'aide
    Par Touareg dans le forum Langage
    Réponses: 4
    Dernier message: 27/02/2007, 17h04
  2. Classe et objet + Modules standards
    Par Girzi dans le forum Modules
    Réponses: 2
    Dernier message: 03/11/2006, 21h23
  3. classe statique objet
    Par drKzs dans le forum Langage
    Réponses: 8
    Dernier message: 04/09/2006, 11h58
  4. Réponses: 4
    Dernier message: 16/08/2006, 09h19
  5. Classes et objets...
    Par cyrpaut dans le forum Général Python
    Réponses: 2
    Dernier message: 20/11/2005, 20h48

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