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 :

probleme de syntaxe lié au type


Sujet :

Caml

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

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut probleme de syntaxe lié au type
    Bonsoir a tous,
    j'essaie de creer un module qui ait le type objet et qui soit : soit une epee soit arc etc...

    mais j'obtiens une erreur de syntaxe et je ne vois pas pourquoi ! Si vous pouviez m'eclairer!! merci bien

    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
    module Objet = struct
     
      (* objets d'attaques *)
      type epee = {nom : string ; atk : int}
      type arc = {nom : string ; atk : int}
      type hache = { nom : string ; atk : int}
     
      (* objets de defense *)
      type bouclier = {nom : string ; def_arc : int ; def_autre : int }
      type cotte_maille = { nom : string ; def_arc : int ; def_autre : int }
      type casque = { nom : string ; def : int }
     
      (* objets de soin *)
      type potion = { nom : string ; pv : int }
     
      (* type plus general *)
      type objet =  obj : epee 
    	       | obj : arc 
    	       | obj : hache
    	       | obj : bouclier
    	       | obj : cotte_maille
    	       | obj : casque 
     
    end

  2. #2
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Ce que tu veux faire n'est tout simplement pas possible, et viole le principe même de l'inférence de type à la Caml.

    Une façon de faire, plus simple et presque aussi facile, est d'utiliser un type énuméré avec des constructeurs de type. Une autre solution, plus élégante mais un peu plus lourde, reviendrait à utiliser l'aspect objet de OCaml. On pourrait par exemple définir une interface objet appelée objet, puis autant de classes que d'objets différents.

  3. #3
    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
    Bonsoir,

    En plus de la remarque de fond d'IOWT, j'ajoute que les définitions suivantes posent problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type epee = {nom : string ; atk : int}
    type arc = {nom : string ; atk : int}
    type hache = { nom : string ; atk : int}
    En effet les trois types utilisent les mêmes noms de champs (nom et atk), ce qui va poser des problèmes par la suite... Bref, ici, comme l'a dit IOWT, une solution à base d'objets prend tout son sens...

    Cordialement,
    Cacophrène

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Je pense qu'on peut bien faire ce qu'il veut sans objets, en factorisant les informations similaires dans des sous-types.

    Code pas testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    type objet = { nom : string; caracs : carcs }
    and caracs =
      | Potion of caracs_potion
      | Arme of type_arme * caracs_arme
      | Armure of type_armure * caracs_armure
     
    and caracs_potion = { pv : int }
     
    and type_arme = Epee | Arc | Hache
    and caracs_arme = { atk : int }
     
    and type_armure = Bouclier | Casque | Cotte_maille
    and caracs_armure = { def : type_arme -> int }
    Si on veut éviter les conflits de noms, on peut utiliser des modules. C'est agréable depuis la fonctionnalité Module.(expression) de 3.12.

    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
    module Arme = struct
      type sorte = Epee | Arc | Hache
      type caracs = { atk : int }
    end
     
    module Armure = struct
      type sorte = Bouclier | Casque | Cotte_maille
      type caracs = { def : (Arme.sorte, int) assoc }
      and ('a, 'b) assoc = ('a * 'b) list
    end
     
    type objet = { nom : string; caracs : caracs }
    and caracs =
      | Arme of Arme.sorte * Arme.caracs
      | Armure of Armure.sorte * Armure.caracs
    (Le choix d'un `(Arme.sorte, int) assoc` plutôt qu'un simple `Arme.sorte -> int` est là pour rendre possible la sérialisation)

  5. #5
    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 bluestorm
    Si on veut éviter les conflits de noms, on peut utiliser des modules. C'est agréable depuis la fonctionnalité Module.(expression) de 3.12.
    Je connais quelqu'un qui répondrais que la version 3.12 est encore très récente... et qu'il vaut mieux s'en tenir à 3.11 pour le moment.

    On peut aussi remarquer que, dans un record, si on a explicité {Foo.bar}, il est inutile de préciser {Foo.bar; Foo.foobar}. Une seule levée d'ambiguïté suffit.

    Cordialement,
    Cacophrène

  6. #6
    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
    Je connais quelqu'un qui répondrais que la version 3.12 est encore très récente... et qu'il vaut mieux s'en tenir à 3.11 pour le moment.
    Oui, il faudrait au moins avoir les binaires Windows.

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/08/2009, 11h06
  2. probleme fonction syntaxe
    Par gIch dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 28/02/2005, 09h52
  3. [Débutante] Problèmes de syntaxe
    Par new_wave dans le forum Prolog
    Réponses: 4
    Dernier message: 02/11/2004, 18h39
  4. Réponses: 3
    Dernier message: 17/05/2004, 17h28
  5. Problemes de syntaxe
    Par maahta dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 01/10/2003, 13h40

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