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 :

demande d'aide sur les map ocaml


Sujet :

Caml

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 15
    Points : 4
    Points
    4
    Par défaut demande d'aide sur les map ocaml
    Bonjour,

    je debute en ocaml et comence a m'interesser aux classes, pour un petit projet personnel je dois utiliser les map, mais les tutoriel concernes semblent rares car je n'en ai trouve aucun a ce jour...

    J'ai bien trouve la page de renseignement:
    http://caml.inria.fr/pub/docs/manual.../Map.Make.html

    mais aucun exemples de code... si quelqu'un pouvait me donner un debut de piste sur l'instenciation de map de (type -> classe),

    merci par avance

  2. #2
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Bonjour,

    cherches-tu à utiliser le module Map ou bien à en coder un ? Ensuite, ne confonds-tu pas les termes module et classe ? Ce n'est pas la même chose (Map est un module).

    Cdlt,
    -- Yankel Scialom

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    merci de ta reponse,

    je souhaite l'utiliser, avec un binding sur un type predefini par moi (un int) associe a une classe.

    A moins que les maps caml n'aient rien a voir avec les maps c++ et autres ?

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    help ?

  5. #5
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par Jobozzo Voir le message
    help ?
    Ce genre de messages ne sont pas vraiment appréciés. C'est avec plaisir que je t'apporte mon aide, mais quand je le souhaite. Il faut que je mange aussi.

    Citation Envoyé par Jobozzo Voir le message
    merci de ta reponse,

    je souhaite l'utiliser, avec un binding sur un type predefini par moi (un int) associe a une classe.

    A moins que les maps caml n'aient rien a voir avec les maps c++ et autres ?
    Le module Map d'OCaml fournit les mêmes fonctionnalités que le template de classes map de C++. Il s'utilise aussi de manière équivalente. Mais Map, n'est tout de même pas une classe .

    Comme tu le vois à l'adresse http://caml.inria.fr/pub/docs/manual.../Map.Make.html, Map.Make est un functor. Il s'agit finalement d'une fonction prenant en argument un module et retournant un (autre) module. Un module est un ensemble de types, de fonctions et de constantes, il diffèrent donc légèrement de la notion d'objet (sache qu'OCaml gère aussi l'objet).

    Donc, Map.Make a comme signature functor (Ord : OrderedType) -> S with type key = Ord.t. Démêlons un peu cela :
    • functor est maintenant clair,
    • (Ord : OrderedType) signifie que Map.Make prend en argument un module de type OrderedType,
    • -> S signifie que Map.Make retourne un module de type S.


    Il faut maintenant s'intéresser aux signatures de OrderedType et S :
    http://caml.inria.fr/pub/docs/manual-ocaml/libref/Map.OrderedType.html
    http://caml.inria.fr/pub/docs/manual-ocaml/libref/Map.S.html

    Maintenant que l'on sait tout ça, il faut procéder par étape. Tu veux créer un module qui mappe des données par des entiers. Il faut donc dans un premier temps définir le module de type OrderedType comme étant des entiers ordonnés naturellement ( ... < -2 < -1 < 0 < 1 < 2 < ...). Dans un second temps, il faut fabriquer un module Mapintgrâce à Map.Make et le module précédent. Enfin, il sera possible d'utiliser la map. Le code qui suit est approximatif, je n'ai pas d'OCaml sous la main.

    1. Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      module Z =
      struct
         type t = int
         let compare = Pervasive.compare
      end
    2. Code Ocaml : Sélectionner tout - Visualiser dans une fenêtre à part
      module Mapint = Map.Make(Z)
    3. Code Ocaml : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      let map = ref (Mapint.empty ()) ;;
      List.iter (fun (index,string) -> map := Mapint.add index string !map) [0,"zero"; 1,"un"; 2,"deux"] ;;
      Mapint.find 1 !map ;;


    Note qu'une fois que tu utilises une map (créer grâce à Mapint.empty par exemple), le type de données qu'elle contient est défini et ne peu plus être modifié. Si tu veux plus d'informations n'hésites pas à demander.

    Cdlt,
    -- Yankel Scialom

  6. #6
    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
    Une application qui à un int associerait une fonction qui renvoie un nouvel object

    À priori ça ressemble à de la désérialisation, dans ce cas tu devrais regarder du côté du module Marshal.

    D'autre part Map.Make est pour tout comparable et n'est pas particulièrement optimisé pour le type int. Tu pourrais regarder du côté des arbres Patricia.

    Et encore les arbres Patricia c'est pour des entiers distribués de façon arbitraire. Car si tes entiers sont denses sur un intervalle [0,n] un simple tableau fait très bien l'affaire

    Enfin, si tu es débutant en OCaml et que tu es familier du C++ :
    • il y a de fortes chances que tu surestimes ton besoin de classes.
    • tu devrais plutôt débuter avec les structures régaliennes d'OCaml (listes,n-uplets,enregistrements,types algébriques).
    • la POO en C++ n'est pas transposable dans de la POO à la sauce OCaml, ça n'est pas une simple variante syntaxique, le risque de frustration est non négligeable.
    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.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup a vous deux! vous m'avez bien debroussailer les idees.

    Je cherche en fait a creer un simple serveur irc ocaml grace a unix.cma, tout fonctionne correctement mais grace a des listes d'unix.file_descr (moche, pas de buffer par client, toussa) je pensait donc qu'une map avec

    un type:
    type fd -> Unix.file_descr

    et une classe
    class client :
    object
    val mutable buffer_ : string
    val mutable init_ : bool
    val mutable rdy_ : bool
    method bufferize : string -> unit
    method get_buffer : string
    method get_state : bool
    end

    ferait l'affaire. Cela coniendrait-il ? sinon je pense pouvoir me debrouiller avec un tuple.

    sur ce, je m'adonne a la lecture de tes liens prgasp77!

    Ps: je m'excuse du up, j'etais legerement enerve
    PPs: clavier qwerty

Discussions similaires

  1. demande d'aide sur les APIs java win32
    Par mogo062 dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 18/02/2009, 14h25
  2. [MediaWiki] Demande d'aide sur les pages
    Par ndsaerith dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 15/10/2008, 14h29
  3. demande d'aide sur les bouton
    Par naruto01 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 29/01/2007, 18h20
  4. Réponses: 4
    Dernier message: 31/08/2006, 16h31
  5. Demande d'aide sur les regexp
    Par Uld dans le forum Langage
    Réponses: 1
    Dernier message: 18/08/2006, 22h15

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