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

Langages fonctionnels Discussion :

à quoi servent les langages fonctionnels ?


Sujet :

Langages fonctionnels

  1. #41
    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
    On va assister à une intégration plus ou moins poussée de la notion de fonction anonyme et de fermeture lexicale dans les langages/plateformes les plus utilisées.

    Par contre pour les notions d'immutabilité, d'inférence de type, de types algébriques et de filtrage, ça va rester assez confidentiel.

    Il y a deux opportunités pour le paradigme fonctionnel:
    1. la course à la fréquence n'a pas stoppé mais elle a tellement ralenti que pour l'instant seul le niveau de parallélisme offre des perpectives de gains importants
    2. le niveau des normes concernant les systèmes critiques ne cesse de monter


    Le gros problème pour la première opportunité c'est l'étroitesse de la fenêtre de tir, le monde des semi-conducteurs est très réactif et le parallélisme est une mode qui n'a pas encore trouvé sa killer-app. Et si elle la trouvait je doute que ce soit du côté de la programmation fonctionnelle.

    Sachant que la mode dans le fonctionnel est à la certification, ça deviendra peut être un paradigme important dans les domaines sensibles à la sureté. Et dans le secteur des services ça pourrait devenir un gage de sérieux pour les candidatures à l'embauche. Mais là encore ça peut tenir à des intangibles comme le succès d'image de F#. Récemment, avec Vista, on a bien vu les conséquences d'image d'une campagne promotionnelle trop aggressive et des exigences trop éloignées de la réalité des utilisateurs.
    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.

  2. #42
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    pour infos, C++0x semble quand même avoir adopté l'inférence de type
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #43
    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
    vou zavez rien comprieuh ! le futur, c'est Java é lé zapplicassion internèteuh !mon prof y me la di !
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  4. #44
    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 gorgonite Voir le message
    pour infos, C++0x semble quand même avoir adopté l'inférence de type
    Si c'est de l'inférence de type comme dans C#, je n'appelle pas ça de la vraie inférence :
    Le type de "test" était déjà connu par le compilateur, il suffit de le réutiliser pour x. Tous les cas les plus intéressants de l'inférence ne sont pas traités.

  5. #45
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par LLB Voir le message
    Si c'est de l'inférence de type comme dans C#, je n'appelle pas ça de la vraie inférence :
    Le type de "test" était déjà connu par le compilateur, il suffit de le réutiliser pour x. Tous les cas les plus intéressants de l'inférence ne sont pas traités.

    je crois que c'est quand même plus complexe que cela...

    enfin, c'est quand même un bon début pour un langage "classique", attendons la suite
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  6. #46
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par LLB Voir le message
    Si c'est de l'inférence de type comme dans C#, je n'appelle pas ça de la vraie inférence :
    Le type de "test" était déjà connu par le compilateur, il suffit de le réutiliser pour x. Tous les cas les plus intéressants de l'inférence ne sont pas traités.
    Donne un exemple plus complexe ?
    Et c'est quoi les limites de l'inférence de type C# ?
    Il me semble que l'inférence de type du C++ sera plutôt pas mal évoluée.

  7. #47
    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
    L'inférence de type se limite à la déclaration de variables locales, il me semble. C'est donc de la forme :
    Le compilateur a toujours connu le type de l'expression. Il s'en servait pour vérifier le typage. Donc, réutiliser ce type pour la déclaration de la valeur est simpliste.

    Inférer le type des arguments d'une fonction est déjà plus compliqué et plus intéressant.

    En F# :
    La fonction f a 2 arguments, qui suivent un certain nombre de contraintes. Le type définitif de f sera fixé à la première utilisation (dans ce cas, le type de f dépend du contexte). Ou sinon, f peut être vraiment générique avec le mot-clé "inline". Son type est alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    val inline f :
       ^a ->  ^c ->  ^d
        when ( ^a or  ^b) : (static member ( + ) :  ^a *  ^b ->  ^d) and
             ( ^a or  ^c) : (static member ( * ) :  ^a *  ^c ->  ^b)
    En gros, il faut que les opérateurs d'addition et de multiplication soient définis sur les arguments. Le type de retour de la fonction dépend du type des arguments, ainsi que des méthodes disponibles. C'est donc quelque chose d'autrement plus complexe.

    Pareil pour OCaml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # let f x y = x#foo + y#foo * x#bar;;
    
    val f : < bar : int; foo : int; .. > -> < foo : int; .. > -> int = <fun>
    La fonction f prend deux objets en argument, l'un ayant les attributs foo et bar, l'autre juste bar. La fonction renvoie un type entier.



    Ensuite, on peut donner d'autres exemples plus complexes avec les fonctions d'ordre supérieur. Par exemple, le type List.map est entièrement inféré par le compilateur. Ca m'étonnerait fortement que le compilateur C# puisse en faire autant.

  8. #48
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Ben je crois que C++0x sera capable d'en faire autant à peu près.

    Papier de 2003 :
    http://anubis.dkuug.dk/jtc1/sc22/wg2...2003/n1527.pdf

    Papier de 2006 :
    http://www.open-std.org/jtc1/sc22/wg...2006/n2115.pdf

    Le 2003 comporte des introductions, le 2006 est plus direct dans la spécification de la norme, un peu moins lisible.

  9. #49
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    l'exemple "standard" est :

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main () {
      auto a = 4;
      std::vector<int> v;
      v.push_back(a);
      v.push_back(2);
      for (auto i = v.begin() ; i != v.end() ; ++i) {
        // ...
      }
    }


    contrairement à ce que l'exemple de LLB aurait pu faire croire (attention, je n'ai dit que LLB a dit quelque chose de faux ), auto ne fait qu'utiliser une recherche du type (natif ou précédemment déclaré) tout comme l'aurait fait decltype(v.begin())


    plus d'infos : http://www.open-std.org/jtc1/sc22/wg...2006/n2115.pdf



    EDIT : arf, grillé... trop tard
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  10. #50
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Points : 64
    Points
    64
    Par défaut
    Le paradigme fonctionnel, basé sur le lambda calcul, a ceci de particulier qu'on ne modifi pas la memoire interne de la machine.
    Comme dit précédement, c'est une bonne chose car cela permet de savoir à tous les coups ce qu'il y a dedans quand on la lit, et donc évite les erreures.
    Mais ça interdit les tableaux comme structure de donnée.

    Le tableau est la seule structure de donnée que je connaisse, où les éléments sont accessibles en temps constant. Et donc tous les algorithmes efficaces basé sur cette propriété des tableaux, tombent à l'eau en programmation fonctionnelle.

    J'aurais aimé savoir comment faire donc, sans tableau, pour avoir une structure de donnée où les éléments sont accessibles en temps constant, et donc pouvoir s'en servir pour déveloper dessus les algo les plus efficaces possibles??

  11. #51
    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
    On pourrait faire, bien que ce ne soit jamais implanté dans les langages réels, des tableaux non modifiables dont les éléments sont accessibles en temps constant.

    Il serait, par exemple en OCaml, possible de créer un module utilisant les tableaux classiques, mais en en abstrayant le type, dont les éléments de la structure de données seraient tous accessibles en temps constant.

    C'est très simple à faire, et l'utilisateur final n'a pas à connaître la structure de données réelle.
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  12. #52
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Points : 64
    Points
    64
    Par défaut
    Mais y a un problème.

    Dans une liste, on simule la modification d'un élément, en enlevant l'élément et en le remplaçant par un autre, et en reconstruisant la liste. La complexité de ça c'est globalement linéaire, comme dans la modification d'une liste en langage impératif. Donc on ne perd pas vraiment en performence.

    La modification d'un élément d'un tableau, en langage imperatif, est clairement constant. Je ne vois pas commencer simuler ça en fonctionnel, car pour le simuler il faudrait reconstruire le tableau, ce qui se fait en temps linéaire.

    Est-ce que je me trompe quelque part?

  13. #53
    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
    Le tableau est la seule structure de donnée que je connaisse, où les éléments sont accessibles en temps constant. Et donc tous les algorithmes efficaces basés sur cette propriété des tableaux, tombent à l'eau en programmation fonctionnelle.
    L'élément d'un tableau n'est accessible en temps constant que si tu le désignes par son indice, si tu cherches le minimum, le maximum, ou tout autre élément satisfaisant une quelconque propriété, alors cet élément n'est accessible qu'en temps linéaire.

    Or, satisfaire à une certaine propriété c'est l'exigence la plus courante en algorithmie, être désigné par un indice entier c'est surtout le cas des opérations de bas niveau, en fait c'est principalement réservé à l'accès à une variable par son indice De Bruijn.

    Pour les besoins courants tu as des équivalences entre algos impératifs et fonctionnels, la version fonctionnelle étant parfois asymptotiquement meilleure:
    • le quicksort est à remplacer par le merge-sort
    • la recherche par dichotomie et la table de hachage sont à remplacer par l'AVL (foncteur Map.Make en OCaml)


    La modification d'un élément d'un tableau, en langage imperatif, est clairement constant. Je ne vois pas commencer simuler ça en fonctionnel, car pour le simuler il faudrait reconstruire le tableau, ce qui se fait en temps linéaire.

    Est-ce que je me trompe quelque part?
    À l'aide d'un arbre binaire la copie modifiée du tableau se fait en un temps linéaire au nombre de bits du mot machine, c'est-à-dire en 32 ou 64 étapes maximum. C'est une constante.
    Mais en pratique il est plus direct de ne pas utiliser du tout d'indices entiers.
    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.

  14. #54
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par SpiceGuid Voir le message
    la table de hachage [est] à remplacer par l'AVL
    Je supose que tu parles du chainage lors de la gestion des colisions?

    Citation Envoyé par SpiceGuid Voir le message
    indice De Bruijn.
    Je n'sais pas du tout c'que c'est qu'ça. Désolé pour mon ignorance.

    Citation Envoyé par SpiceGuid Voir le message
    À l'aide d'un arbre binaire la copie modifiée du tableau se fait en un temps linéaire au nombre de bits du mot machine, c'est-à-dire en 32 ou 64 étapes maximum. C'est une constante.
    Je n'connais pas non plus cette technique/propriété. Toujours à cause de mon ignorance. Comment cela est-il mis en oeuvre??


    Il faut quand même avouer, que la façon de résoudre un problème est quand même plus subtil par une approche fonctionnelle, que par une approche impérative. J'utilise ici le mot "subtil"... non pas dans un sens negatif mais... plutôt dans le sens où c'est quand même pas donné aux amateurs quoi (noté que j'ai pas utilisé le mot "naturel", ou "facile", pour pas relancer le débat là dessus mdr).

  15. #55
    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
    • L'indice De Bruijn c'est le déplacement dans la fenêtre de pile (offset d'une variable dans la stack-frame)
    • Un AVL est un arbre binaire (de recherche) équilibré
    • Dans un arbre binaire le chemin qui mène de la racine à un certain noeud est de la forme (left|right)*, alors qu'un entier en base 2 est de la forme (0|1)*. L'astuce consiste à considérer l'indice dans un tableau d'abord comme un entier en base 2 puis comme un chemin dans un arbre binaire, bit à 0 aller à gauche, bit à 1 aller à droite. Pour modifier un élément il suffit alors de dupliquer le chemin depuis la racine jusqu'à la feuille et de n'y changer que la valeur de la clé concernée.
    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.

  16. #56
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Points : 64
    Points
    64
    Par défaut
    Je sais ce qu'est un AVL, mais une table de hache est un tableau muni d'une fonction de hachage. L'un des principes pour gerer les colisions est l'utilisation de listes chainés, mais sur wikipedia il est dit que ces listes chainés peuvent être remplacé par des arbres équilibrés. Je me demandais si c'etait de ça que tu parlais.
    Mais au vu de ce que tu dis, j'ai plutot tendance à penser que tu parles d'un AVL pour remplacer la totalité de la table de hachage, et de la recopier à chaque fois en un temps 32 ou 64 comme tu le ferais pour simuler un tableau. Et biensur, tu résoud les colisions par la technique de l'adressage ouvert.

    En tout cas c'est très interessant.

  17. #57
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    pour infos, quand SpiceGuid parle d'équivalences quicksort/mergesort, il y a quand même un ENORME oubli... le fait que le tri soit fait sur place, ce qui est un plus si l'on traite beaucoup de données, ou que l'on se place en environnement "limité"
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  18. #58
    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
    Effectivement, ça n'est pas du tout une équivalence, c'est seulement un substitut d'une façon impérative (avec utilisation d'un tableau) vers une autre façon plus fonctionnelle (sans utilisation d'un tableau).
    Ça vaut aussi pour les hashtableet les AVL qui sont substituables en terme d'interface mais qui ont aussi leurs qualités respectives.

    Tout ça pour dire qu'il ne faut pas forcément utiliser les même algos en fonctionnel qu'en impératif ( le quicksort sur les listes dans tools/basis.anubis).
    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.

  19. #59
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    il y a quand même un ENORME oubli... le fait que le tri soit fait sur place
    J'imagine, mais ce n'est pas le propos de ma question, d'autant plus que cette difference est en faveur du tri fusion. Ma question porte seulement sur la complexité.

    EDIT en rapport avec le message du dessous :
    pardon, tu as dis "sur place" dans ma tete j'ai pensée "stable"

  20. #60
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par nonpoluant Voir le message
    J'imagine, mais ce n'est pas le propos de ma question, d'autant plus que cette difference est en faveur du tri fusion.
    ben tu n'as soit jamais fait de "gros" programmes, soit rien compris à ce que j'ai dit plus haut

    Citation Envoyé par nonpoluant Voir le message
    Ma question porte seulement sur la complexité.
    ben tu as ta réponse... il est possible d'avoir des structures de même complexité dans les langages fonctionnels (même si ce sera surement une interface fonctionnel sur quelque chose d'impératif ), donc les mêmes complexités théoriques
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

Discussions similaires

  1. à quoi servent les .dsm ?
    Par fidji dans le forum Delphi
    Réponses: 4
    Dernier message: 14/06/2006, 19h37
  2. [MySQL] A quoi servent les réferences entre les tables??
    Par Alain15 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 18/02/2006, 16h19
  3. A quoi servent les index dans une BDD ?
    Par Melvine dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 25/10/2005, 12h14
  4. [CR 10] A quoi servent les Templates Fields ?
    Par caviar dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 10/11/2004, 10h52
  5. [C#] A quoi servent les interfaces???
    Par sof_nns dans le forum Windows Forms
    Réponses: 8
    Dernier message: 28/10/2004, 20h51

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