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 :

en Ocaml, comment fait-on "data Mydata = (etc) deriving (Eq, Ord, Show, Read, Typeable, Data, Generic)


Sujet :

Caml

  1. #1
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 84
    Points
    84
    Par défaut en Ocaml, comment fait-on "data Mydata = (etc) deriving (Eq, Ord, Show, Read, Typeable, Data, Generic)
    Bonjour,

    tout (ou presque ) est dans le titre. Je voudrais me lancer dans un projet perso en Ocaml, dont j'ai trouvé un équivalent embryonnaire en Haskell (ici, mais ce n'est pas vraiment l'important : https://github.com/digitalmentat/org...arse/issues/17)

    Ce la me fait penser que j'ai toujours admiré la puissance naturelle du "deriving" en Haskell, qui en trois mot permet de tester l'égalité, d'ordonner, d'imprimer (Eq, Ord, Show) (etc), et et que je voudrais bien savoir comment faire la même chose en Ocaml !

    Dans le cas présent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    data Mydata = (...)
                   deriving (Eq, Ord, Show, Read, Typeable, Data, Generic)
    Euh, vaste question ? ou au contraire, il y a le petit truc qui va bien et que je ne connais pas encore ?

  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 Pas de typeclasses en OCaml
    La réponse rapide : on ne peut pas le faire car il n'y a pas de typeclasses.

    Toutefois une grande partie des fonctionnalités de ces typeclasses est disponible dans différents modules, notamment les modules Pervasives et Marshal.

    En particulier :

    • Le symbole == est l'égalité physique, les autres opérateurs de comparaison sont disponibles dans le module Pervasives (opérateurs =, <>, <, >, >=, <= et fonction compare).
    • La lecture et l'écriture des données au format binaire (sérialisation) sont disponibles dans le module Marshal.


    La lecture et l'impression des données au format texte sont particulières : ces fonctionnalités ne sont disponibles que dans le toplevel (l'interpréteur en ligne de commande). Autrement la sérialisation texte est disponible via Sexpr ou SExpr.

    Pour ce qui est des types conteneur générique on a déjà abordé la question dans le sujet Iterateur sur type quelconque.
    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.

  3. #3
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par SpiceGuid Voir le message
    La réponse rapide : on ne peut pas le faire car il n'y a pas de typeclasses.

    Toutefois une grande partie des fonctionnalités de ces typeclasses est disponible dans différents modules, notamment les modules Pervasives et Marshal.

    En particulier :

    • Le symbole == est l'égalité physique, les autres opérateurs de comparaison sont disponibles dans le module Pervasives (opérateurs =, <>, <, >, >=, <= et fonction compare).
    • La lecture et l'écriture des données au format binaire (sérialisation) sont disponibles dans le module Marshal.


    La lecture et l'impression des données au format texte sont particulières : ces fonctionnalités ne sont disponibles que dans le toplevel (l'interpréteur en ligne de commande). Autrement la sérialisation texte est disponible via Sexpr ou SExpr.

    Pour ce qui est des types conteneur générique on a déjà abordé la question dans le sujet Iterateur sur type quelconque.
    OK. Merci de ta réponse très documentée.
    En, fait, je veux programmer un projet personnel, et j'hésite encore entre Haskell et OCaml. Je ne suis pas du tout programmeur/développeur, juste ... amateur. Dès que je me lance, je reviens ici :-) C'st un projet de recherches de figures remarquables dans un texte.

    Il y a des choses que je préfère nettement chez Haskell :
    1- deriving (ok, traité ci-dessus)
    2- les signatures "au-dessus" des déclarations : je trouve que ça aide vraiment beaucoup à la compréhension du code
    Code pseudo-Haskell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    -- pseudo-Haskell
    f :: 'a list -> int -> 'a list
    f list pos = .... 
    -- je vois tout de suite que f est en fait nth (il y a bien sûr d'autres possibilités moins évidentes, mais le nom de la fonction clarifiera de toute façon ... un remove peut avoir la même signature par exemple
    ou encore :
    Code pseudo-Haskell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    -- pseudo-Haskell
    f :: 'a list -> 'a -> int
    f list elt = .... 
    -- je vois tout de suite que f renvoie le n° d'occurence (le premier probablement) de elt
    3- le where à la place de let : permet d'exprimer sa pensée de façon plus naturelle...

    Mais j'ai un penchant naturel pour OCaml par ailleurs ...


    Tu pourrais me dire le mieux qu'on puisse faire en OCaml pour les points 2 et 3 ?

  4. #4
    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
    Tu peux très bien typer une fonction avant de la déclarer (bien sûr ça n'est pas aussi propre qu'en Haskell) :
    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    let rec f : 'a list -> 'a -> int = 
    fun list elt ->
      match list with
      | [] -> raise Not_found
      | h::t -> if h=elt then 0 else 1 + f t elt

    Le where existait en Caml-Light, il a été supprimé en OCaml parce qu'il fallait trop souvent expliciter la portée de la déclaration. Et fréquemment on écrivait where là où il fallait écrire where rec.
    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.

  5. #5
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 84
    Points
    84
    Par défaut
    Haha pour ton exemple tu as pris le contre-pieds de mon message en donnant une autre fonction que celle que j'imaginais

    Oui effectivement ça se fait en OCaml, mettre la signature, mais c'est quand même moins propre comme tu dis.


    Merci pour tes éclairages !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 30/05/2005, 16h58
  2. [IE]Comment fait-on un plug-in ?
    Par le Daoud dans le forum Windows
    Réponses: 2
    Dernier message: 13/04/2005, 18h54
  3. Réponses: 6
    Dernier message: 08/04/2005, 03h00
  4. [light] Comment fait-on une lumiere constante ?
    Par :GREG: dans le forum OpenGL
    Réponses: 2
    Dernier message: 14/03/2004, 17h54

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