Précédent   Forum du club des développeurs et IT Pro > Autres langages > Langages fonctionnels > Caml
Caml Forum d'entraide sur la programmation avec les langages fonctionnels Caml-Light et OCaml
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 11/06/2012, 11h37   #1
Jobozzo
 
Homme
Étudiant
Inscription : 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 : -2
Points : -2
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
Jobozzo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2012, 11h56   #2
prgasp77
Membre Expert
 
Avatar de prgasp77
 
Homme Yankel Scialom
Ingénieur en systèmes embarqués
Inscription : juin 2004
Messages : 1 031
Détails du profil
Informations personnelles :
Nom : Homme Yankel Scialom
Âge : 26
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 031
Points : 1 493
Points : 1 493
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,
__________________
gasp in touch
-- Yankel Scialom
prgasp77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2012, 12h09   #3
Jobozzo
 
Homme
Étudiant
Inscription : 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 : -2
Points : -2
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 ?
Jobozzo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2012, 13h56   #4
Jobozzo
 
Homme
Étudiant
Inscription : 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 : -2
Points : -2
help ?
Jobozzo est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 11/06/2012, 14h36   #5
prgasp77
Membre Expert
 
Avatar de prgasp77
 
Homme Yankel Scialom
Ingénieur en systèmes embarqués
Inscription : juin 2004
Messages : 1 031
Détails du profil
Informations personnelles :
Nom : Homme Yankel Scialom
Âge : 26
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 031
Points : 1 493
Points : 1 493
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 :
    1
    2
    3
    4
    5
    module Z =
    struct
       type t = int
       let compare = Pervasive.compare
    end
  2. Code Ocaml :
    module Mapint = Map.Make(Z)
  3. Code Ocaml :
    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,
__________________
gasp in touch
-- Yankel Scialom
prgasp77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2012, 19h53   #6
SpiceGuid
Rédacteur
 
Avatar de SpiceGuid
 
Homme Damien Guichard
Inscription : juin 2007
Messages : 1 518
Détails du profil
Informations personnelles :
Nom : Homme Damien Guichard
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : juin 2007
Messages : 1 518
Points : 2 500
Points : 2 500
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: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo.
Avant de poser une question je lis les règles du forum.
SpiceGuid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2012, 13h44   #7
Jobozzo
 
Homme
Étudiant
Inscription : 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 : -2
Points : -2
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
Jobozzo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h35.


 
 
 
 
Partenaires

Hébergement Web