|
Publicité ' | ||||||||||||||||||||||||
|
|
#41 | ||||||||
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 963 ![]() |
Citation:
c'est donc faisable, mais plus long Citation:
Citation:
Citation:
encore une fois, c'est possible... fait juste le prendre en compte à la conception Citation:
Citation:
Citation:
Citation:
------------------------------------------------------------------------ Bon je pense qu'on a fait le tour de la question OCaml vs F#, qui ne sont pas très éloignés... Il serait peut-etre temps de changer de sujet... ou de faire le meme genre de comparatif avec d'autres langages |
||||||||
|
|
00
|
|
|
#42 | |
|
Membre Expert
![]() ![]() Inscription : septembre 2006 Messages : 1 036 ![]() |
Je crois sincèrement que tu n'as rien compris au langage : on peut bien-sûr écrire des listes de fonctions, du moment qu'elles ont le même type... car tout est valeur, y compris les fonctions, et les listes prennent en charge des éléments de même type, donc des fonctions de même type. Même en C-ANSI tu ne peux pas faire ce que tu veux : tu ne peux pas mettre dans un même vecteur de fonctions des fonctions de type différent... à moins de faire des choses non standard !
Ensuite, le fait de ne pas avoir de fonction prenant en argument un nombre quelconque n'est pas une limitation en soi : tu ne peux pas non plus faire ça en C ! Imagine que ta fonction d'exponentiation puisse prendre en paramètre un entier ou un flottant : quel sera le type de retour ? un entier ? un flottant ? Ta fonction ne serait plus utilisable ! Ou encore du genre : "si j'ai un entier, alors je retourne un entier, et sinon un flottant"... tu trouves ça propre ? Moi je trouve ça archi-dégueulasse. De plus, ce genre de construction empêcherait très clairement de faire des optimisations de code pour le compilateur, comme le manuel de GHC, qui autorise la surcharge, le fait comprendre très clairement. Pour ce qui est des fonctions à plusieurs arguments, là encore, tu veux utiliser quelque chose qui n'a pas de sens dans le système de typage de Objective Caml. Quel serait le type d'une fonction prenant un nombre quelconque d'arguments en paramètre ? Idem pour les n-uplets quelconques : quel est leur type ? Là réponse est toute simple : il n'y en a pas. Objective Caml reste cohérent de bout en bout avec lui-même. Si tu veux contourner tout celà, tu peux toujours utiliser des fonctions avec labels et arguments optionnels, qui permettent en plus de faire commuter les arguments, voire d'en omettre. Pour ce qui est de ça : Citation:
Depuis peu, on peut également faire d'une classe un type unique incompatible avec toute autre classe, même si définissant les mêmes méthodes avec les mêmes types. L'explication se trouve ici... http://caml.inria.fr/pub/docs/manual...manual021.html ... section 7.10 "Private row types". La classe définie est tout bonnement incompatible avec toute autre classe de même type. Franchement je trouve que les soi-disant "limitations" évoquées n'en sont pas parce qu'elles n'ont pas de sens. Pour ce qui est des classes en Objective Caml, je suis désolé, mais on ne peut pas dire qu'elles n'apportent rien de plus au langage. Le système fournit énormément de possibilités que ne fournit aucun autre langage (objet fonctionnels, sous-typage sans héritage et constructeurs fonctionnels dont on peut en faire des applications partielles) et accorde une souplesse extrême. Le grand problème, c'est que le système de classe est très mal documenté et que les gens ne sont tout simplement pas au courant des possibilités qu'offre cette extension. De plus, la majorité des programmeurs Objective Caml sont des personnes voulant monter aux arbres en faisant du tout récursif-fonctionnel "parce que c'est très beau" (comme des professeurs que j'ai eus) et ne veulent entendre rien d'autre. Si j'avais un peu plus de temps, j'aimerais bien fournir de la documentation lisible et accessible sur ces sujets et points très subtils du langage, car il y en a un certain nombre. Comme je le dis : si tu veux de la surcharge à gogo, regarde su côté de Haskell, mais là, tu t'en mordras les doigts si tu penses que Objective Caml est trop rigide (ce n'est pas une critique envers Haskell, langage que j'aime beaucoup) ! |
|
|
|
00
|
|
|
#43 | |||||||||
|
Membre Expert
![]() Inscription : mars 2002 Messages : 962 ![]() |
Citation:
Citation:
Code :
Parfois, on peut s'en sortir en jouant avec l'évaluation partielle et en renvoyant une fonction. Mais pas dans cet exemple. Et pour le typage : ('a -> bool) -> ('a -> bool). ('a pouvant être une fonction) Citation:
Citation:
Citation:
Citation:
Citation:
Je disais juste que j'en ai jamais ressenti le besoin de les utiliser (et que j'en ai rarement rencontrés), mais ça dépend peut-être du type de programme que l'on écrit. J'apprécie beaucoup le typage structurel, c'est aussi agréable que le duck typing, mais c'est entièrement statique et sûr. J'aimerais bien avoir cette même souplesse dans le reste du système. Il y a un certain nombre de cas où l'on doit réécrire plusieurs fois la même fonction en changeant juste le type, et je trouve ça dommage. Il y a énormément de choses que j'apprécie dans Caml, mais parfois je souhaiterais plus de souplesse et de généricité. |
|||||||||
|
|
00
|
|
|
#44 | ||
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 963 ![]() |
Citation:
Citation:
comme toujours avec toi... mais cela peut avoir un sens pour d'autres |
||
|
|
00
|
|
|
#45 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 963 ![]() |
Citation:
et pourquoi ? C est un langage qui demande juste de faire attention à ce qu'on écrit car on doit presque tout gérer à la main... chose parfaitement inconcevable pour nombre de "purs programmeurs fonctionnels" |
|
|
|
00
|
|
|
#46 |
|
Membre Expert
![]() ![]() Inscription : septembre 2006 Messages : 1 036 ![]() |
Si on s'en tient à la norme C-ANSI, le C est très rigide et peu permissif. Le problème, c'est que les compilateurs sont eux très laxistes.
|
|
|
00
|
|
|
#47 | |
|
Inactif
Inscription : juillet 2005 Messages : 1 958 ![]() |
Citation:
C'est incomparable avec des langages qui ne visent pas à rester proche de la machine mais au contraire à s'en séparer. C'est comme dire: je peux comparer ma ferrari F350 et mon tracteur parce que toutes les deux roulent sur des routes: on ne s'adresse pas du tout au même personne. Le paysan sur sa ferrari aura l'air richemment idiot. Et le playboy sur un tracteur aura juste l'air idiot ^_^ C'est pareil pour le C et les langages fonctionnels en général et ocaml en particulier. Le C ne devrait pas être vu comme un langage de haut niveau de nos jours et devraient être utilisé pour ce qu'il fait de mieux : construire d'autres langages. Malheureusement inertie de l'industrie l'obligeant, on continue à faire apprendre du C en math parfois -_- |
|
|
|
00
|
|
|
#48 | |
|
Inactif
Inscription : juillet 2005 Messages : 1 958 ![]() |
Citation:
C'est effectivement un problème de mentalité et de philosophie. En fait c'est le débat entre les aristotéliciens et les platoniciens du moyen-âge (ce n'est pas de moi cette réflexion). Un tout objet c'est une vision qui dit qu'un type est un élément constitutif du monde et peut se manipuler. C'est la vision d'Aristote sur les idées. Un typage fort à-la caml c'est une vision disant que le type est au-dessus et ne peut se manipuler. C'est la vision de Platon sur les idées. |
|
|
|
00
|
|
|
#49 | |
|
Membre Expert
![]() ![]() Inscription : septembre 2006 Messages : 1 036 ![]() |
Citation:
|
|
|
|
00
|
|
|
#50 | |
|
Inactif
Inscription : juillet 2005 Messages : 1 958 ![]() |
Citation:
le C en tant que langage de haut niveau est particulièrement merdique; le C en tant que langage de bas niveau est merveilleux. De plus en plus de non-informaticiens sont amenés à programmer. « Non-informaticien » signifiant que ce n'est pas leur métier. Et dans ce cadre, le C est une plaie et non une aide. Ce qu'ils veulent c'est des langages exprimant les concepts aisément et non des langages s'embourbant dans des subtilités syntaxiques inadéquates et proche de l'assembleur. Ainsi, physiciens, mathématiciens et autres géomaticiens, pour ne citer que les plus nombreux ici, n'ont aucun intérêt dans un langage comme le C. Un informaticien y trouvera sa part par contre. D'où mon analogie avec le playboy et le fermier... chacun doit avoir un outil adapté à ses besoins. Comme le soulignait Alan Kay il y a quelques années, l'informatique est actuellement un échec: elle voulait donner les moyens à des corps de métier non spécialisé d'automatiser des tâches. Des langages comme le C sont à contre-pied de ceci. Mais reste nécessaire pour ceux qui ont les mains dans le cambouis. --- Pour revenir au sujet, donc, tous les langages fonctionnels ont cette idée qu'il faut voir abstrait et de haut niveau. Ça a toujours été le cas. Après on rentre dans des saveurs personnelles. J'adore le scheme, car j'aime le typage faible. Mais je comprends les remarques de LLB (si je ne me trompe pas) sur la syntaxe. Personnellement, je n'y ai jamais vu aucun problème (très faible temps d'adaptation), mais il est clair que si la syntaxe est ainsi très claire et simple, la notation préfixée fait une marche supplémentaire que caml aide à traverser. À l'enseignement, je vois chaque année combien des personnes n'ayant jamais programmé sont bien plus à l'aise avec un langage fonctionnel qu'un langage à-la C. Et il faut exactement 6 heures de cours pratique pour que la notation ne soit plus un obstacle. Le système de typage d'ocaml par contre, s'il est appréciable pour qqun connaissant le principe, n'aide pas à l'apprentissage et oblige une certaine rigidité mal venu. Mais cependant, elle est elle aussi plutôt vite absorbé, surtout quand l'auditoire est scientifique. Il suffit de mettre le parallèle sur les ensembles mathématiques et cela passe beaucoup mieux qu'avec la même matière (les types) en C par exemple. Je ne connais pas assez bien Miranda ou Haskell pour me prononcer de la même manière. Et sinon Common Lisp ou Scheme, ça ne change pas grand chose. Je n'ai jamais utilisé les autres langages mentionnés. |
|
|
|
00
|
|
|
#51 | ||
|
Membre Expert
![]() ![]() Inscription : septembre 2006 Messages : 1 036 ![]() |
Si tu veux mon avis, je pense aussi, comme tu l'as dit, que l'informatique est un échec.
Cependant, ce ne sont pas les langages fonctionnels qui aideront les physiciens ou (pire encore !) les chimistes à programmer deux algorithmes à la noix. Beaucoup d'entre eux ont déjà du mal avec des environnements bien foutus et faciles d'accès comme MATLAB ou MAPLE... alors leur parler de Scheme ou d'Objective Caml... ! Je vois mal des physiciens ou des chimistes coder : Code :
Il faut se rendre à l'évidence : le C, l'ADA, le Haskell, le Scheme, l'OCaml, etc... tout ça, c'est de l'informatique informaticienne. Ce sont des langages d'informaticiens, faits par des informaticiens pour des informaticiens. Ni plus ni moins. Seul FORTRAN 77 (et non 90 !), il faut l'avouer, a réussi son pari : rendre la programmation accessible à un public qui est non informaticien. |
||
|
|
00
|
|
|
#52 | |
|
Inactif
Inscription : juillet 2005 Messages : 1 958 ![]() |
Citation:
L'exemple que tu donnes n'est pas syntaxiquement agréable et est, pour moi, le genre de raison qui me font finalement préféré Scheme. FORTRAN a réussi parce qu'il placait des concepts avant la syntaxe à son époque... de nos jours ce n'est que l'inertie qui explique la réussite continue de FORTRAN. C'est parce que c'est encore utilisé que ça existe encore. Le LISP a été fait dans la même idée et n'est pas un langage fait par et pour les informaticiens. Ce qui explique sont échecs malgré ses grandes idées (manque de performance due à l'avancé des connaissances techniques par exemple). Si on avait eu un compilateur lors de sa création, les choses seraient probablement très différent. Ici, au Canada, beaucoup de physiciens, ceux qui ne vont pas jusqu'en maîtrise, terminent dans l'informatique de toute façon. |
|
|
|
00
|
|
|
#53 | |
|
Expert Confirmé Sénior
![]() ![]() |
Citation:
Ca se lit comme ça s'écrit, et c'est extrêmement proche de la notation mathématiques (tu remplaces le <- par un appartient)... C'est l'écriture la plus élégante et la plus explicite du quicksort que je connaisse ! qsort de la liste vide donne la liste vide, qsort de x cons xs donne (qsort des éléments inférieurs à x dans xs) concat x cons (qsort des éléments supérieurs ou égal à x dans xs) Je sais bien qu'on peut faire pareil en Scheme, mais plus proche de la notation mathématique ou plus agréable à l'oeil (ça c'est une question de goût, personnellement les parenthèses à répétition je trouve ça confus, même si un bon éditeur de texte aide) ? -- Jedaï |
|
|
|
00
|
|
|
#54 |
|
Membre Expert
![]() ![]() Inscription : septembre 2006 Messages : 1 036 ![]() |
Honnêtement, j'ai rarement vu des physiciens ou autres non informaticiens faire autre chose que du FORTRAN-MAPLE-MATLAB.
Là où je suis en ce moment, à l'ENSEEIHT, on a un gros département de mathématiques appliquées et de calcul scientifique. Les gens qui travaillent dans ce domaine sont essentiellement des mathématiciens et on peut affirmer sans trop se tromper que ce sont eux aussi qui ont le rapport "le moins difficile" avec l'informatique, puisque la finalité est tout de même de produire du code. Bien que ces gens-là soient capables de produire des algorithmes et des programmes extrêmement optimisés, il est très clair que l'informatique n'est pas réellement leur tasse de thé. Entre autres, on voit trop souvent des programmes entiers en un seul fichier (la programmation modulaire ne semble pas être pleinement rentrée dans les moeurs), des méthodes de conception et de "généricité" plus que douteuses (ou très alambiquées), des codes qui, bien qu'ils compilent avec à peu près la plupart des compilateurs de grande diffusion, ne sont pas standards (on voit encore trop de REAL*8 en FORTRAN 77 par exemple, ou des fonctionnalités dépendant trop d'une implantation particulière), etc... Lorsqu'on les entend parler, le code est pour eux un détail (expression prise telle quelle), et on sent bien que, que ce soit du côté des numériciens comme du côté des physiciens ou autres, l'aspect "programmation" et numérique de la chose est sinon une tâche ingrate, une étape soit-disant "facile" sur laquelle il ne vaut mieux pas y passer trop de temps. D'un autre côté, c'est normal, car ce n'est pas leur boulot. Pour ce qui est de la programmation fonctionnelle, je pense qu'il s'agit réellement, en termes de langages de programmation, le meilleur paradigme qui soit ; en fait, la programmation fonctionnelle est tout simplement le meilleur choix technologique qui soit. Cependant, trop de raisons font qu'en réalité, son usage n'est pas toujours adapté : les concepts sont souvent trop abstraits, la syntaxe peut parfois laisser dubitatif, et le fonctionnement n'est pas naturel dans le sens où, une fois démuni de l'affectation, beaucoup perdent leurs repères car il faut raisonner "fonctionnel", c'est-à-dire penser le programme en termes de données et non en termes procéduraux (chose que les langages tout objet ont exacerbé à un point insuportable). La programmation fonctionnelle, c'est avant tout un style de programmation dirigé par les données et non par les traitements... Haskell et les langages paresseux le prouvent admirablement bien : si un calcul (ou traitement) ne sert à rien, il n'est pas effectué ! |
|
|
00
|
|
|
#55 | ||
|
Inactif
Inscription : juillet 2005 Messages : 1 958 ![]() |
Citation:
Nous avons ici le Mammouth, c'était il y a qqs mois encore le plus gros calculateur du Canada. C'est essentiellement les physiciens qui l'utilisent. Et ils font bien plus de C et de C++ que du Fortran (mais ils l'utilisent certes). Dans à peu près toutes les universités nord-américaines, la programmation est obligatoire pour les physiciens et les mathématiciens. C'est plus de 75% du temps du C ou du C++. Citation:
La syntaxe ne laisse en rien dubitatif. C'est la première que tu apprends qui influence normalement la suite en la faisant paraître « plus naturel. » Personnellement j'ai appris avec "Logo's turtle". Un mathématicien pense souvent « fonctionnel » car il réfléchit par récursivité et par fonction. Ce n'est pas l'habitude en programmation impérative. Pour peu que ton mathématicien soit un catégoriste c'est encore plus évident. Les concepts abstraits ne les dérangent pas trop en général N.B. Au passage, si je suis maintenant prof d'info, je suis mathématicien/logicien de formation. |
||
|
|
00
|
|
|
#56 | |
|
Inactif
Inscription : juillet 2005 Messages : 1 958 ![]() |
Citation:
Mais être extrêmement proche d'une écriture mathématique ne veut pas dire plus claire ni plus agréable à l'oeil Dans ce cas, je trouve personnellement qu'un mot est plus clair. Mais c'est personnel tout ça: agréable ou désagréable est toujours une notion personnelle. Pour information, d'après les données sur les mesures logiciels, il n'y a pas beaucoup plus de parenthèses dans le scheme qu'il y a de parenthèses, de crochets ou d'accolades dans le C (à nombre de lignes équivalent). De nombreux dialectes de Scheme intègrent la gestion des accolades et crochets comme des parenthèses pour donner plus de choix. Parfois c'est effectivement agréable. |
|
|
|
00
|
|
|
#57 | ||
|
Membre Expert
![]() ![]() Inscription : septembre 2006 Messages : 1 036 ![]() |
Citation:
Citation:
Si la programmation fonctionnelle était dirigée par les traitements, celà voudrait dire que l'ordre d'évaluation des expressions aurait une importance cruciale ; or il n'en est rien, et c'est tout le contraire. Les langages paresseux ont justement été créés pour ça, pour ne pas induire le principe de l'ordre d'évaluation des expressions ! De plus, la programmation mathématique peut être classiquement de l'ordre du traitement, mais on peut aussi en faire à un niveau données ! |
||
|
|
00
|
|
|
#58 | |
![]() ![]() ![]() Nicolas ValléeIngénieur d'études Inscription : décembre 2005 Messages : 9 963 ![]() |
Citation:
ben ce n'est plus une spécificité des langages fonctionnelles... il existe une optimisation relativement simple à effectuer (une fois qu'on est sous forme SSA), qui permet de ne garder que le code atteignable (au sens que si le résultat d'un calcul n'est pas utilisé pour une I/O il sera oublié |
|
|
|
00
|
|
|
#59 | |
|
Inactif
Inscription : juillet 2005 Messages : 1 958 ![]() |
Citation:
Mais lorsque faire un programme en fonction du traitement, c'est voir ton programme selon sa simple fonctionnalité en mettant de côté, dans l'architecture de ton programme, les entités sur lesquelles tu agis. Faire selon les données, c'est réflechir en prenons en compte les données, abstraire sur elle, puis regarder leurs interactions. L'évaluation paresseuse peut très bien être dirigé par les traitements. Je ne sais pas qui t'a appris ça, mais il avait une mauvaise interprétation d'un programme orienté par le traitement. C'est plutôt la programmation procédurale qui est en lien avec le traitement, et la programmation par objets/classes/aspect qui est en lien avec les données. Dans les deux cas tu peux faire ou non de l'évaluation paresseuse. Remarques c'est peut être juste qu'on a pas les mêmes définitions |
|
|
|
00
|
|
|
#60 | ||||
|
Membre Expert
![]() ![]() Inscription : septembre 2006 Messages : 1 036 ![]() |
Citation:
Citation:
La seule chose que j'ai dite, c'est que les programmes fonctionnels étaient dirigés par les données, c'est-à-dire que l'ordre des traitements est lui-même fortement correlé à la structure interne des données. La notion de filtrage, par exemple, en est un exemple : rien de tel dans langage plus procédural (mis à part le switch du C... et encore !). Les langages plus impératifs/procéduraux retardent de beaucoup les traitements spécifiques à certaines données : un bon exemple en est la programmation tout objet où les traitements spécifiques sont souvents implantés par plusieurs sous-classes, de même niveau, héritant d'une super-classe ou implantant une interface. C'est ici un exemple de programmation où les données ne dirigentt que très sommairement les traitements. En effet, si on a deux classes Class1 et Class2 implantant une même interface Interface, le code purement spécifique aux données de Class1 et Class2 se situe au niveau de l'initialisation, c'est-à-dire (en Java) : Code :
En programmation fonctionnelle, on aurait utilisé un filtrage ! |
||||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com