svp ,qu est ce qu'un langage fonctionnel ? et quels sont les autres types de langage .
Merci d'avance
svp ,qu est ce qu'un langage fonctionnel ? et quels sont les autres types de langage .
Merci d'avance
Ma réponse rapide.qu'est ce qu'un langage fonctionnel ?
Paradigme de programmationquels sont les autres types de langage ?
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.
(même si le message de départ mériterait d'êter ignoré, on peut dévir la discussion)
Donc, si on fait du C avec gcc, on a un langage fonctionnel ? La définition me semble insuffisante (mais parler de fermetures semble juste).
"Riche" est un terme flou et contestable. L'inférence de type ne me semble pas être un point pertinent de la définition.
Depuis longtemps, je considère qu'un langage supporte le fonctionnel à partir du moment où les fonctions sont des objets de première classe, c'est-à-dire qu'elles sont manipulables comme n'importe quel autre type de base (donc, avoir les fonctions anonymes et l'ordre supérieur).
Cette affirmation me semble plutôt contestable. J'ai l'impression que c'est comparable.il est plus fructueux d'associer une extension objets à un langage fonctionnel que le contraire
Si ça peut être une mesure: le système de types doit être riche au point qu'il devienne difficilement supportable de ne pas être assisté par une forme d'inférence de type. Ça reste flou et contestable mais ça redevient pertinentEnvoyé par LLB
Pour le reste je pense que mon billet anticipait très bien ses propres insuffisances.
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.
Ce n'est pas que la question n'est pas intéressante, c'est que la réponse a déjà été donnée de nombreuses fois et qu'une recherche aurait suffi.
Je pose ma question ici vu que l'autre fil est déjà à 5 pages
J'ai lu le wikipédia sur le paradigme programmation et là je ne sais pas si je peux me fier à cette page car programmation fonctionnelle et programmation récursive par exemple sont-ils comparables?
Je pense aussi, vu que le blog de Damien n'explique pasEnvoyé par zin_rbt
Qu'est-ce qu'on peut faire de type de langage autre que les fameux: C, C++, Java, aujourd'hui avec le .net? La programmation fonctionnelle est-elle une technique sans if then, boucle, récursivité?
Je pense qu'on peut aborder le paradigme fonctionnel dans un premier temps en comprenant que «tout est fonction» (dans le même esprit que le «code is data» de LISP). Une variable devient donc une fonction ayant une valeur constante, une fonction constante de type f(x) = 1 en math. L'emploi de la récursivité dans les langages fonctionnels s'inscrit, toujours à mon avis, dans la même logique «mathématique» du paradigme.
Peut-être que la lecture de l'article suivant : Paradigmes : Le fonctionnel, permettra d'offrir des explications moins précises et plus abordables que l'article de la wikipédia.
[EDIT] Je viens de trouver la citation suivante de bluestorm qui me semble pertinente et certainement plus clair que ma tentative d'explication :
En gros, un langage est considéré comme fonctionnel quand il permet de passer des fonctions comme argument ou comme valeur de retour d'une autre fonction, et qu'il favorise le style déclaratif (en gros, le fait de coder sans effets de bords ou presque).
Merci pour ta réponse So.Ta mais en fait, je suis maintenant confus sur le terme paradigme?
En fait, les langages du genre C, C++, Java, PHP sont de quel type de programmation donc?
Je pense que l'introduction de l'article Paradigme de la Wikipédia est assez claire à ce sujet :Les langages que tu cites comme le C++, le Java et le PHP peuvent être considéré comme multi-paradigmes car on retrouve des éléments caractérisant certains paradigmes de programmation dans chacun d'entre eux. Par exemple, le C++ peut être considéré comme étant impératif et orienté objet.Un paradigme est une représentation du monde, une manière de voir les choses, un modèle cohérent de vision du monde qui repose sur une base définie (matrice disciplinaire, modèle théorique ou courant de pensée). C'est en quelque sorte un rail de la pensée dont les lois ne doivent pas être confondues avec un autre paradigme.
C'est ce qui se fait. En C++, on trouve des bibliothèques comme Boost::lambda ; dans C++1x, les fonctions anonymes arrivent en standard ; C# s'est beaucoup inspiré des langages fonctionnels pour plusieurs fonctionnalités, notamment Linq ; Ruby est très proche des langages fonctionnels ; etc.
La différence de taille qu'il reste est : quelle approche est la plus naturelle dans chacun de ces langages ? Quel paradigme est privilégié, que ce soit dans la syntaxe ou la bibliothèque standard ? Par exemple, lorsque le symbole "=" correspond à l'assignation et que les valeurs sont mutables par défaut, cela incite à faire des effets de bord. À l'inverse, on peut regarder si utiliser des fonctions comme map est encouragé.
A quoi sert donc d'utiliser les différents langages comme Haskell, Scheme, etc si le fonctionnel est utilisable dans les langages informatiques courants?
Par curiosité, y a-t-il donc des IDE pour Haskell, Scheme, etc?
Parce que ce n'est pas juste en ajoutant des "fonction de première classes" qu'on obtient un langage qui va plaire aux habitués des "vrais" langages fonctionnels !
Bien sûr, ce qui nous plait c'est d'avoir ces fonctions de premières classes dont on peut faire ce qu'on veut. Mais pas que ! Moi ce qui me plait avant tout, c'est une sémantique claire et sans surprise. J'entends par là que quand je regarde le programme, je le comprends. Et un des éléments des "langages fonctionnels" qui y participe est la persistance. Je m'explique:
si j'écris quelque chose comme :
en supposant que la seconde ligne défini une fonction qui ajoute x à y. Qu'est ce que j'ai à la fin ? x vaut 5, ok, mais f ? Est ce que c'est la fonction qui ajoute 3 ou la fonction qui ajoute 5 ? Dans un langage fonctionnel, f sera toujours la fonction qui ajoute 3. Dans beaucoup de langages impératifs avec ajout de traits fonctionnel, f sera la fonction qui ajoute 5. C'est à dire qu'en changeant une variable, je change le sens d'une fonction, qui a pu déjà partir bien loin.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 x = 3; f y = y + x; x = 5
Pour moi elle est là la vraie différence
Et attention, je ne dis pas qu'il faut forcément utiliser des langages fonctionnels pures à la Haskell hein (quoi que je fasse en fait majoritairement du Coq )
vim et emacs ? :pPar curiosité, y a-t-il donc des IDE pour Haskell, Scheme, etc?
Fonctionnels... purs.
En Caml, par exemple, les strings sont modifiables, les tableaux aussi. Si tu donnes un tableau à f, tu n'as pas de garantie de le retrouver dans le même état :
À l'inverse, C++ est capable de vérifier que le tableau n'est pas modifié par erreur (sauf const_cast).
Code : Sélectionner tout - Visualiser dans une fenêtre à part val f : int array -> int
En fait, la question est beaucoup trop vague. Pourquoi utiliser Haskell ou Scheme plutôt que C++ ou PHP ? On parle de langages très différents, d'un côté comme de l'autre, et faire une réponse générale est difficile.Envoyé par Lucas Panny
Pour moi, la différence est le paradigme principale du langage, celui qui est le plus naturel (cela dépend du langage et de sa bibliothèque standard).
Pour moi, c'est l'un des problèmes, ces langages manquent d'IDE de qualité. F# est maintenant intégré à Visual Studio, mais les autres n'ont rien de convaincant à mon avis. Bien sûr, il y a toujours Emacs qui est un éditeur formidable, mais il a du retard en ce qui concerne la complétion, le signalement des erreurs en temps-réel, le refactoring, etc. Pareil pour ViM.Par curiosité, y a-t-il donc des IDE pour Haskell, Scheme, etc?
Non, je parle bien de Caml. Quand je définis
j'ai un arbre persistant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part type 'a tree = | Leaf | Node of 'a tree * 'a * 'a tree
Par défaut, les records sont persistants.
Quand j'écris
je sais que x ne vaudra jamais None, et que même si on mute le contenu de v, x vaudra toujours Some v.
Code : Sélectionner tout - Visualiser dans une fenêtre à part let x = Some v in...
Donc effectivement, on n'atteint pas le niveau de Haskell, mais il faut arrêter de croire que la persistance est l'apanage des langages purs. La persistance *est* omniprésente en caml
Caml aussi, avec un effort minimal (et le "sauf" ici est Obj.blah. Donc pas de sauf ):
Effectivement, puisque ce n'est pas par défaut, ce n'est pas dans les libs. Mais ça reste parfaitement possible.
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 Const_Array = (struct type 'a t = 'a array let length = Array.length let get = Array.get let const a = a let unconst = Array.copy end: sig type 'a t val length : 'a t -> int val get : 'a t -> int -> 'a val const : 'a array -> 'a t val unconst : 'a t -> 'a array end)
J'ai l'impression qu'un certain nombre d'utilisateur d'haskell ont un peu trop vite tendance à mépriser le système de type de caml...
TropMDR : attention à ne pas prendre la mouche : LLB est un utilisateur de Caml lui aussi (quand il n'est pas du côté obscur de F#) et c'était plus une critique de la bibliothèques standard (c'est vrai qu'à posteriori, mettre les strings mutable c'était une belle erreur) que du langage (ou du système de type qui n'a pas grand chose à voir).
Ceci dit, je comprends ta frustration, parce qu'il y a effectivement une forme d'élitisme de la part des langages qui se sont collés une étiquette de "pureté" qui n'est pas toujours justifiée. C'est un malheur de terminologie, mais utiliser le terme "pur / impur" pour désigner la quantité d'effet de bord a donné lieu, assez naturellement (mais surtout chez les débutants) à une idée de supériorité absolue des "purs" sur les "impurs", ce qui est un peu injuste.
L'idée de limiter les effets de bords est très intéressante. OCaml le fait, Haskell le fait, encore plus, mais pas tout à fait ! Pas besoin de beaucoup jouer sur les mots pour dire que la non-terminaison par exemple est un effet de bord, et que la paresse (call-by-thunk) aussi... Quand on pousse les définitions, on se rend compte qu'un langage "pur" doit être un langage total, et que, chez nous pauvres piétons qui n'utilisont pas encore un assistant de preuve pour scripter notre éditeur de texte, il faut se résigner à être sale, inconsistant et fondamentalement impur. Les camliens se le voient répéter à longueur de journée donc ils ont fini par accepter la dure réalité, mais les Haskelliens se sentent parfois les chevilles gonfler...
C'est du reste dommage car Haskell est un langage qui a plein d'autres choses intéressantes à montrer. Ce serait une grave erreur de se limiter à penser que Haskell est simplement un langage dont les utilisateurs se sentent supérieurs parce qu'ils utilisent, pour rendre leur code illisible, non pas des effets de bord mais des "monades".
Avec seul le langage Haskell ou Scheme peut-on développer des applications comme Microsoft Word, un jeu vidéo?
Oui.
Il existe un éditeur de texte en Haskell (yi), plusieurs jeux vidéos en Haskell ou Scheme (sans compter les jeux qui sont codés dans autre langage mais scriptables dans une variante de Lisp). Historiquement le Lisp (donc plus largement que Scheme) a été pas mal utilisé par certaines (vieilles) boîtes de jeux (cf. GOAL par exemple).
Un des meilleurs éditeurs de texte est écrit quasi-exclusivement en Emacs Lisp, un dialecte bâtard de Lisp qui a de nombreux défauts mais a permis la mise en place d'un écosystème assez unique.
Le problème des langages marginaux c'est leur manque d'interopérabilité avec les énormes et repoussantes normes de communication du monde "mainstream". Tu trouveras moins de frameworks XML activeUML blabla dans ces langages, et ça peut rendre difficile le déploiement d'un produit qui n'utilise que ça. Par contre ils sont toujours aussi performants pour les parties intéressantes où le code doit résoudre des problèmes difficile, et pas seulement s'interfacer avec le protocole de Web Services à la mode.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager