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 :

Qu'est-ce donc que Extlib Enum ?


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 Qu'est-ce donc que Extlib Enum ?
    Bonjour,

    je viens de découvrir la librairie Extlib, (après avoir codé moi-même une partie de ses fonctions dont j'avais besoin ... bon exercice pour débuter).

    Je voudrais savoir si quelqu'un peut me dire ce qu'est Enum, et à quoi cela sert.

    Merci d'avance !

  2. #2
    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
    C'est une "énumération". Tu peux penser ça comme une liste d'éléments, mais l'implémentation est beaucoup plus générique (... et compliquée).

    Cette structure a été pensée pour être en quelque sorte la "langue commune" des structures de données les plus courantes : au lieu d'implémenter Array.filter, DynArray.filter, etc., on implémente Array.to_enum, DynArray.to_enum, et un Enum.filter.

    Plus généralement, si tu as seulement besoin "d'énumération" et sans contraintes algorithmiques particulières (comme les listes qui permettent de récupérer la queue en O(1), ou les tableaux qui ont un accès à une case arbitraire), par exemple pour juste effectuer une action sur tous les éléments à la suite, tu peux utiliser Enum. En quelque sorte c'est une structure "neutre".

    Son implémentation est assez sophistiquée parce qu'elle est faite pour pouvoir "communiquer" avec les autres structures de données de la manière la plus efficace possible (c'est à dire pouvoir faire des conversions dans les deux sens rapidement, pas comme Array.of_list qui est linéaire). En particulier elle utilise des méthodes "paresseuses" pour reporter le travail inutile.
    Tu n'as pas à te soucier de ça tant que tu utilises Enum "normalement". Si un jour tu as des besoins très spécifiques de performance tu pourras toujours t'y plonger, mais en attendant je te le déconseille : utilise Enum comme une énumération, les fonctions de conversion sans gêne, et voilà.

  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
    Merci Bluestorm c'est grace à toi que j'ai découvert ExtLib qui va me rendre de grands services je ense, tu en parlais .

    Ceci étant, je ne suis pas sûr d'avoir bien compris... tu aurais un petit exemple sous la main ?


    ma recherche sur Google / code search n'a rien donné.

  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 991
    Points
    2 991
    Par défaut
    C'est passionnément inintéressant.
    Ceci étant, je ne suis pas sûr d'avoir bien compris... tu aurais un petit exemple sous la main ?
    En gros, si j'ai bien lu bluestorm, ça fait une alpha conversion, en OCaml on le ferait avec un let:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let module Enum = DynArray in ... Enum.filter ...

  5. #5
    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
    Euh, non. C'est des fonctions de conversion, comme Array.of_list / Array.to_list.

    Code ocaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let ton_enum = Dynarray.enum ton_dinarray in
    Enum.filter_map ... ton_enum (* par exemple *)

    james-ml : tu peux lire la doc

  6. #6
    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 bluestorm Voir le message
    james-ml : tu peux lire la doc
    oui c'est ce que j'avais fait, mais le mot énum m'a fait peur. Je comprends que cela s'utilise comme des listes, mais avec des conversions possibles vers des tableaux, et optimisées de surcroit (paresseuses ?).

    Je creuse le sujet car j'ai actuellement un bout de code à écrire ou j'utilise des listes de 2 façons :
    -avec des maps, des fold et autres dans la plupart des cas
    -parfois besoin d'un accès séquentiel
    J'ai implémenté ça sur des listes, et j'ai sagement remis l'optimisatoin de la partie à accès direct à plus tard.
    Enum pourrait-il m'aider ?

    Citation Envoyé par SpiceGuid Voir le message
    C'est passionnément inintéressant.

  7. #7
    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 991
    Points
    2 991
    Par défaut
    Je m'explique:
    • l'environnement OCaml est riche en outils et en librairies
    • la programmation fonctionnelle est basée sur un modèle behavioriste (lambda-calcul et catégories bicartésiennes fermées), au contraire de la machine de Turing dont l'intérêt réside principalement dans sa simplicité mécanique


    Du coup il paraît plus excitant pour le débutant d'explorer toutes les choses autour du langage plutôt que le coeur du langage lui-même.
    Si c'est une phase d'approche pour se familiariser à petits pas avec un langage qui est indéniablement difficile alors pourquoi pas.
    Ce qui serait dommage c'est que ça devienne une manière de passer à côté du paradigme fonctionnel.

    -parfois besoin d'un accès séquentiel
    Quelque chose comme List.iter ?

  8. #8
    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
    Je m'explique:
    • l'environnement OCaml est riche en outils et en librairies
    • la programmation fonctionnelle est basée sur un modèle behavioriste (lambda-calcul et catégories bicartésiennes fermées), au contraire de la machine de Turing dont l'intérêt réside principalement dans sa simplicité mécanique


    Du coup il paraît plus excitant pour le débutant d'explorer toutes les choses autour du langage plutôt que le coeur du langage lui-même.
    Si c'est une phase d'approche pour se familiariser à petits pas avec un langage qui est indéniablement difficile alors pourquoi pas.
    Ce qui serait dommage c'est que ça devienne une manière de passer à côté du paradigme fonctionnel.
    SpiceGuid, te lire est toujours un plaisir, surtout quand tu t'expliques.

    Je ne suis pas sûr de bien te comprendre : tu veux dire que les "Enum" se situent "autour du langage" ?
    Cependant quand je regarde le type Enum, je pense que c'est d'avantage "au cœur" qu'"autour" du langage, dans le sens où on ne les manipule que via .map, .fold, .iter et autres .filter.

    Ceci dit je ne l'ai pas utilisé, et, me considérant encore un peu débutant, certes, je reste résolument preneur de bons conseils...

    Quelque chose comme List.iter ?
    non, accès direct comme List.nth ou List.assoc

    Je pense que pour ce genre d'accès un tableau serait mieux, et je me pose la question sur les types Enum.

    Néanmoins, comme dit plus haut, les 3/4 de mes manipulations se font au travers de map, map2, foldleft etc, donc j'ai implémenté des listes.
    J'essaye de limiter au maximum la récursion à la main, bien que cela soit très tentant...

  9. #9
    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 991
    Points
    2 991
    Par défaut
    Alors tu vas être un peu déçu, d'après ce que je peux lire dans la doc déjà mentionnée par bluestorm le module Extlib/Enum :
    • n'a pas de fonction map2 ou équivalent
    • n'a ni nth ni assoc ou équivalents
    • n'est pas une implémentation d'un nouveau TAD mais seulement une interface 'unifiée' pour des TADs déjà existants

  10. #10
    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
    Pourquoi ne pas utiliser que des tableaux ? Le module Array propose map et fold_left (et il me semble que map2 est dans extlib (ExtArray), mais sinon tu la recodes).

    Ce qui n'est pas naturel pour un tableau c'est de vouloir "retirer" ou "ajouter" des éléments (comme tu le fais pour une liste). map et fold_left ne font aucun des deux : soit tu produis un tableau avec autant d'éléments, soit tu construis quelque chose qui à priori n'est pas un tableau; aucun des deux ne vont donc à l'encontre de la "structure de données array".

    Ce qui sera problématique ce sont les filter et consorts. Si tu en as besoin, tu peux convertir en liste localement, puis récupérer un tableau à nouveau, ce qui ne me choque pas.

  11. #11
    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
    # n'a pas de fonction map2 ou équivalent
    # n'a ni nth ni assoc ou équivalents
    je peux toujours les coder, ce qui me permettrait de les soumettre aux développeurs de la bibliothèque...

    Citation Envoyé par SpiceGuid
    n'est pas une implémentation d'un nouveau TAD mais seulement une interface 'unifiée' pour des TADs déjà existants
    stp, c'est quoi un TAD ?

    Citation Envoyé par bluestorm Voir le message
    Pourquoi ne pas utiliser que des tableaux ? Le module Array propose map et fold_left
    oui effectivement je n'avais pas vu le problème sous cet angle.
    (et il me semble que map2 est dans extlib (ExtArray), mais sinon tu la recodes).
    effectivement, ça ne doit pas prendre plus de 30 min à coder, même pour un lent comme moi ...

    Ce qui sera problématique ce sont les filter et consorts. Si tu en as besoin, tu peux convertir en liste localement, puis récupérer un tableau à nouveau, ce qui ne me choque pas.
    Pour en revenir à ExtNum (et peut-être pour en finir avec lui ?), est-ce que Enum justement ne serait pas la structure qui permettrait de faire des conversions optimisées ? J'implémenterait Enum en général, et lorssque j'ai besoin de liste ou de tableaux, je ferai des conversions, qui sont paresseuses si j'ai bien compris ?

Discussions similaires

  1. [EDI] Quel est l'éditeur que vous recommandez pour PHP ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 400
    Dernier message: 10/04/2018, 21h08
  2. « Mais qu'est-ce donc que HTML5 ? »
    Par Hinault Romaric dans le forum Balisage (X)HTML et validation W3C
    Réponses: 102
    Dernier message: 06/02/2014, 12h30
  3. Qu'est ce donc que le String ^ ?
    Par Guiiil dans le forum Langage
    Réponses: 2
    Dernier message: 16/06/2009, 12h00
  4. [D7][DBase 4] Qu'est-ce donc que la propriété Table1.DataBaseName ?
    Par alainvh dans le forum Bases de données
    Réponses: 10
    Dernier message: 19/08/2007, 20h09
  5. DBExpress est plus lent que BDE?
    Par palassou dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/07/2004, 09h39

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