Précédent   Forum du club des développeurs et IT Pro > Autres langages > Langages fonctionnels
Langages fonctionnels Forum d'entraide sur la programmation en langages fonctionnels : Lisp, Scheme, Caml, Haskell, Erlang, Oz, Anubis, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 12/02/2010, 11h50   #1
zin_rbt
Candidat au titre de Membre du Club
 
Avatar de zin_rbt
 
Inscription : février 2007
Messages : 68
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 68
Points : 14
Points : 14
Par défaut langages fonctionnels ?

svp ,qu est ce qu'un langage fonctionnel ? et quels sont les autres types de langage .

Merci d'avance
zin_rbt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2010, 16h43   #2
SpiceGuid
Rédacteur
 
Avatar de SpiceGuid
 
Homme Damien Guichard
Inscription : juin 2007
Messages : 1 512
Détails du profil
Informations personnelles :
Nom : Homme Damien Guichard
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : juin 2007
Messages : 1 512
Points : 2 495
Points : 2 495
Citation:
qu'est ce qu'un langage fonctionnel ?
Ma réponse rapide.

Citation:
quels sont les autres types de langage ?
Paradigme de programmation
__________________
Du même auteur: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo.
Avant de poser une question je lis les règles du forum.
SpiceGuid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2010, 19h21   #3
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 962
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 962
Points : 1 148
Points : 1 148
(même si le message de départ mériterait d'êter ignoré, on peut dévir la discussion)

Citation:
Envoyé par SpiceGuid Voir le message
c'est un langage qui offre les fermetures
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).

Citation:
Envoyé par SpiceGuid Voir le message
c'est un langage avec un sytème de typage riche, offrant l'inférence de type
"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).

Citation:
il est plus fructueux d'associer une extension objets à un langage fonctionnel que le contraire
Cette affirmation me semble plutôt contestable. J'ai l'impression que c'est comparable.
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2010, 20h01   #4
SpiceGuid
Rédacteur
 
Avatar de SpiceGuid
 
Homme Damien Guichard
Inscription : juin 2007
Messages : 1 512
Détails du profil
Informations personnelles :
Nom : Homme Damien Guichard
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : juin 2007
Messages : 1 512
Points : 2 495
Points : 2 495
Citation:
Envoyé par LLB
"Riche" est un terme flou et contestable. L'inférence de type ne me semble pas être un point pertinent de la définition.
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 pertinent

Pour le reste je pense que mon billet anticipait très bien ses propres insuffisances.
__________________
Du même auteur: le cours OCaml, le dernier article publié, le projet, le blog dvp et le jeu vidéo.
Avant de poser une question je lis les règles du forum.
SpiceGuid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2010, 22h22   #5
zin_rbt
Candidat au titre de Membre du Club
 
Avatar de zin_rbt
 
Inscription : février 2007
Messages : 68
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 68
Points : 14
Points : 14
Citation:
Envoyé par LLB Voir le message
(même si le message de départ mériterait d'êter ignoré, on peut dévir la discussion)...
pourtant ca a mérité un article
zin_rbt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2010, 22h50   #6
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 962
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 962
Points : 1 148
Points : 1 148
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.
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2010, 12h39   #7
Lucas Panny
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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?

Citation:
Envoyé par zin_rbt
pourtant ca a mérité un article
Je pense aussi, vu que le blog de Damien n'explique pas

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é?
  Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2010, 03h48   #8
So.Ta
Membre à l'essai
 
Inscription : avril 2008
Messages : 18
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 18
Points : 22
Points : 22
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 :
Citation:
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).
So.Ta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2010, 13h14   #9
Lucas Panny
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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?
  Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2010, 12h15   #10
So.Ta
Membre à l'essai
 
Inscription : avril 2008
Messages : 18
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 18
Points : 22
Points : 22
Je pense que l'introduction de l'article Paradigme de la Wikipédia est assez claire à ce sujet :
Citation:
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.
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.
So.Ta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/08/2010, 18h06   #11
gasche
Membre Expert
 
Inscription : avril 2007
Messages : 829
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 829
Points : 1 007
Points : 1 007
gasche est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/08/2010, 08h31   #12
Lucas Panny
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Citation:
Envoyé par So.Ta Voir le message
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.
Multiparadigme? Donc un peu de tout dans ces langages. Pourquoi on ne leur ajoute pas aussi le fonctionnel au lieu de faire des langages seulement fonctionnels comme Scheme et Haskell?

En fait, y a-t-il donc un IDE Scheme et lorsqu'on compile on obtient un .exe?
  Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2010, 17h11   #13
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 962
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 962
Points : 1 148
Points : 1 148
Citation:
Envoyé par Lucas Panny Voir le message
Pourquoi on ne leur ajoute pas aussi le fonctionnel au lieu de faire des langages seulement fonctionnels comme Scheme et Haskell?
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é.
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2010, 16h42   #14
Lucas Panny
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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?
  Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2010, 11h41   #15
TropMDR
Membre chevronné
 
Inscription : mars 2010
Messages : 281
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 281
Points : 752
Points : 752
Citation:
Envoyé par Lucas Panny Voir le message
A quoi sert donc d'utiliser les différents langages comme Haskell, Scheme, etc si le fonctionnel est utilisable dans les langages informatiques courants?
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 :
Code :
1
2
3
4
x = 3;
f y = y + x;
x = 5
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.

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 )

Citation:
Par curiosité, y a-t-il donc des IDE pour Haskell, Scheme, etc?
vim et emacs ? :p
TropMDR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2010, 18h30   #16
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 962
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 962
Points : 1 148
Points : 1 148
Citation:
Envoyé par TropMDR Voir le message
Et un des éléments des "langages fonctionnels" qui y participe est la persistance.
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 :
Code :
val f : int array -> int
À l'inverse, C++ est capable de vérifier que le tableau n'est pas modifié par erreur (sauf const_cast).

Citation:
Envoyé par Lucas Panny
A quoi sert donc d'utiliser les différents langages comme Haskell, Scheme, etc si le fonctionnel est utilisable dans les langages informatiques courants?
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.
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).

Citation:
Par curiosité, y a-t-il donc des IDE pour Haskell, Scheme, etc?
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.
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2010, 22h10   #17
TropMDR
Membre chevronné
 
Inscription : mars 2010
Messages : 281
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 281
Points : 752
Points : 752
Citation:
Envoyé par LLB Voir le message
Fonctionnels... purs.
Non, je parle bien de Caml. Quand je définis
Code :
type 'a tree = | Leaf | Node of 'a tree * 'a * 'a tree
j'ai un arbre persistant.

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.
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

Citation:
Envoyé par LLB Voir le message
À l'inverse, C++ est capable de vérifier que le tableau n'est pas modifié par erreur (sauf const_cast).
Caml aussi, avec un effort minimal (et le "sauf" ici est Obj.blah. Donc pas de sauf ):
Code :
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)
Effectivement, puisque ce n'est pas par défaut, ce n'est pas dans les libs. Mais ça reste parfaitement possible.
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 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2010, 01h33   #18
gasche
Membre Expert
 
Inscription : avril 2007
Messages : 829
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 829
Points : 1 007
Points : 1 007
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".
gasche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2010, 09h46   #19
Lucas Panny
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Avec seul le langage Haskell ou Scheme peut-on développer des applications comme Microsoft Word, un jeu vidéo?
  Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2010, 12h17   #20
gasche
Membre Expert
 
Inscription : avril 2007
Messages : 829
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 829
Points : 1 007
Points : 1 007
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.
gasche est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h32.


 
 
 
 
Partenaires

Hébergement Web