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] Variant polymorphes


Sujet :

Caml

  1. #1
    alex_pi
    Invité(e)
    Par défaut [OCaml] Variant polymorphes
    Bonsoir à tous.

    Ceci n'est pas une question. Je voulais juste dire que j'avais enfin regardé les variants polymorphes de OCaml disponibles depuis la version 3, et que ça vaut franchement le détour. Je me permets de le souligner parce que j'en vois très peu "dans la nature" (je ne les ai jamais croisé sur les forums de developpez.net), et qu'il me semble que ça peut, dans certain cas, être assez puissant. Un petit exemple de code :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    (* différents types *)
    type num = [`Float of float | `Int of int]
    type 'a opp = [`Plus of 'a | `Moins of 'a]
    type 'a func = [`Sin of 'a | `Cos of 'a]
     
    (* pour récupérer la valeur flottante *)
    let recup_float = function
      | `Int x -> float_of_int x
      | `Float x -> x
     
    (* séparation de la fonction pour traiter les évaluation 
       de fonctions*)
    let eval_fun eval = function
      | `Sin x -> `Float (sin (recup_float (eval x)))
      | `Cos x -> `Float (cos (recup_float (eval x)))
     
     
    let apply_opp opp_int opp_float = function
      | `Int x, `Int y -> 
          `Int (opp_int x y)
      | `Int x, `Float y ->
          `Float (opp_float (float_of_int x)  y)
      | `Float x, `Int y ->
          `Float (opp_float x  (float_of_int y))
      | `Float x, `Float y -> 
          `Float (opp_float x y)
     
     
    (* séparation de la fonction pour traiter les évaluation 
       d'application d'oppérateur*)
    let eval_opp eval = function
      | `Plus (x, y) ->
          apply_opp (+) (+.) (eval x, eval y)
      | `Moins (x, y) ->
          apply_opp (-) (-.) (eval x, eval y)
     
    (* utilisation des deux fonctions précédantes *)
    let rec eval = function
      | #num as r -> r
      | #opp as opp -> eval_opp eval opp
      | #func as func -> eval_fun eval func
     
    (* début des exemples *)
     
    let eval_affiche x = match eval x with
      | `Int x -> print_int x; print_newline ()
      | `Float x -> print_float x; print_newline ()
     
    let un = `Int 1
    let deux = `Float 2.
    let s1 = `Sin (`Float 3.14159)
    let o1 = `Plus (`Moins (un,s1), deux)
    let o2 = `Moins (`Cos un, o1)
    let _ = eval_affiche o2
    Après, il est vrai que le typage peut faire un peu peur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    val o2 :
      [> `Moins of
           [> `Cos of [> `Int of int ] ] *
           [> `Plus of
                [> `Moins of [> `Int of int ] * [> `Sin of [> `Float of float ] ] ] *
                [> `Float of float ] ] ]
    Pour de plus amples détails la doc officielle

    Après, c'est sûr, on perd une certaine sécurité gagné par la définition complete des types unions. Mais je pense qu'avec un peu de rigueur dans l'annotation de type (qui permet de vérifier qu'une fonction a bien le type que l'on croit), le gain peut être plus qu'appréciable.

  2. #2
    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
    Dans certains cas ça remplace avantageusement la POO.
    En particulier ça permet la modularisation de l'évaluation, très pratique pour écrire un interpréteur: code reuse through polymorphic variants
    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.

Discussions similaires

  1. Réutilisation à l'aide de variants polymorphes
    Par SpiceGuid dans le forum Caml
    Réponses: 2
    Dernier message: 01/06/2011, 22h29
  2. Réponses: 6
    Dernier message: 23/08/2010, 12h46
  3. Réponses: 2
    Dernier message: 13/07/2009, 01h00
  4. [F#] équivalent des Polymorphic variants de OCaML
    Par JohnT-47 dans le forum Caml
    Réponses: 1
    Dernier message: 04/10/2007, 12h47
  5. Convertion de type VARIANT à type CString
    Par j_grue dans le forum MFC
    Réponses: 2
    Dernier message: 07/11/2002, 14h18

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