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] Typage des structures de données physiquement modifiables


Sujet :

Caml

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut [OCAML] Typage des structures de données physiquement modifiables
    Bonjour,

    J'ai une signature de module que j'aimerais implanter de deux manières différentes. Les modules doivent définir un type t. L'un des modules définit t comme un tableau. L'autre module définit t comme des Mappe (camllib)

    Or la signature contient des fonctions manipulant clairement t comme une structure impérative que les Mappe ne sont pas. (i.e. des fonctions -> unit, dont la sémantique est clairement de faire des modification sur la structure passée en paramètre)

    Donc, le type t doit être une structure de donnée modifiable. L'idée la plus simple est de le déclarer dans le second cas comme une référence sur des Mappe. Mais alors, les fonctions ne retournent plus le type désiré, en particulier la fonction empty.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let empty = ref Mappe.empty
    qui du coup n'est plus de type

    mais de type

    Et là... je ne sais pas quoi faire. Non, seulement, je ne comprends pas la différence avec l'implantation avec des tableaux, puisque les tableaux sont une structure de donnée modifiable, mais de plus, je ne sais pas comment modifier la signature de mes modules ou bien comment modifier l'implantation pour avoir le même résultat, mais que ce soit typable.

    Pourriez vous m'éclairer sur les solutions succeptibles de résoudre le problème ?

  2. #2
    alex_pi
    Invité(e)
    Par défaut
    Même en dehors d'un point de vue "typage", écrire dans ton module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let empty = ref Map.empty
    est faux.
    En effet, supposons que deux utilisateurs de ton module M récupèrent la map vide, puis fassent des choses dessus. Il vont en fait travailler avec la même référence, et donc se marcher sur les pieds.

    C'est d'ailleurs ce qui explique que le type est avec un _. Si tu écris que ref Mappe.empty est de type 'a t, ça veut dire que tu peux y ajouter autant des entier que des booléens. Et donc obtenir une map hétérogène. Beuuuuuurk.

    Une solution est donc de faire quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    module M = 
    (struct
      type 'a t =  'a list ref
     
      let empty () = ref []
     
      let add e rl = rl := e :: !rl
     
    end : sig
       type 'a t
       val empty : unit -> 'a t
       val add : 'a -> 'a t -> unit
     end);;
    (J'ai mis des listes pour être sûr que ça compile chez moi).
    En effet ici, chaque appel à "empty" génère une nouvelle référence, donc pas de problème. Et là le type de empty se lit "pour tout type 'a, si tu me donnes un unit, je te fournis un 'a t", et surtout pas "si tu me fourni un unit, je te donne quelque chose qui pour tout type 'a est de type 'a t" qui poserait le même problème. Moralement, l'instanciation de 'a se fait avant l'appel de la fonction.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    C'est parfait !

    Merci.

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

Discussions similaires

  1. La programmation des structures de données
    Par wafiwafi dans le forum Langages de programmation
    Réponses: 16
    Dernier message: 01/01/2010, 20h07
  2. Présentation des structures de données arborescentes
    Par PRomu@ld dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 30/01/2009, 14h39
  3. Réponses: 13
    Dernier message: 27/02/2008, 09h49
  4. Files Mapping pour stocker des structures de données
    Par Targan dans le forum Débuter
    Réponses: 0
    Dernier message: 27/12/2007, 11h38
  5. redim Imbrication des structures de données
    Par totoche dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 28/11/2007, 15h23

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