[prev in list] [next in list] [prev in thread] [next in thread]
List: haskell-fr
Subject: [Haskell-fr] Re: =?windows-1252?Q?inf=E9rence?=
From: westondan () imageworks ! com (Dan Weston)
Date: 2007-09-20 16:31:29
Message-ID: 46F2D8B2.5090605 () imageworks ! com
[Download RAW message or body]
J'offre les quelques petites suggestions ci-dessous avec la pr?caution
que le fran?ais n'est pas ma langue maternelle (ni Haskell non plus!)
Dan Weston
Dupont Corentin wrote:
> Pour ma soci?t?, j'ai ?crit une petite introduction ? Haskell.
> Vos critiques sont les bienvenues.
> Je vous la fait lire:
>
>
> Titre : Pr?sentation du langage Haskell
>
> Salut ? tous !
>
> Je me suis int?ress? (? titre personnel) r?cemment ? un nouveau
> langage de programmation g?n?raliste : Haskell.
>
> L'article est ? classer dans la cat?gorie ? R&D ? :
> Malgr? tous les concepts int?ressants qu'il introduit, il est encore
> peu utilis? dans le monde industriel
mais jouit d'une croissance acc?l?rante d'utilisation, ce qui promet un
r?le de plus en plus important dans l'avenir.
> . Mais il vaut le d?tour !!
> Haskell est un langage r?cent (moins d'une dizaine d'ann?es).
>
> Quelques stats pour vous donner envie de lire la suite :
> - 10 fois moins de lignes de code qu'en C
> - Grande expressivit?.
> - Compr?hension, maintenabilit? largement accrue.
>
> C'est un langage bas? sur une th?orie math?matique (la th?orie de
> cat?gories). Ce langage est ? fonctionnel pur ?, par opposition aux
> langages ? imp?ratifs ?, dont font parties tous les langages les plus
> connus (C, C++, Ada, Java, Pascal?).
> Cela induit un mode de programmation radicalement diff?rent !
>
> Haskell est :
>
> - paresseux
> - pleinement fonctionnel
> - fortement typ?, et supporte l'inf?rence de type
>
> Haskell est effectivement paresseux, mais ce n'est pas p?joratif !
> Cela signifie qu'il n'?value pas une expression si ce n'est pas
> n?cessaire. Si le r?sultat d'un calcul n'est pas utilis? dans la suite
> du programme, il n'est pas ?valu?.
En revanche, gr?ce ? la transparence r?f?rentielle, le r?sultat d'une
expression une fois ?valu?e peut ?tre m?moiz?
(http://fr.wikipedia.org/wiki/M%C3%A9moization) et r?utilis? ailleurs,
?vitant le co?t de calculs redondants.
> Cela induit un gain ?vident en terme de temps de traitement.
> Cela am?liore aussi le design des programmes puisque cela d?charge le
> programmeur de coder certaines optimisations, pour se concentrer sur
> le m?tier de son logiciel.
>
> Mais surtout, cela permet de faire certaines abstractions tr?s
> int?ressantes : comme par exemple des structures de donn?es de taille
> infinie.
> En Haskell il est tout ? fait possible de d?clarer un ? tableau ? de
> taille infinie, par exemple un tableau contenant tous les ?l?ments de
> la suite de Fibonacci !
> Bien s?r vous choisirez de n'afficher que les n premiers ?l?ments, et
> Haskell d?cidera de ne calculer que ceux l?. (Voir l'exemple
> faramineux de wikipedia?)
>
>
> Ensuite Haskell est pleinement fonctionnel : les fonctions sont des
> objets de ? 1ere classe ?.
> Cela signifie que les fonctions peuvent ?tre trait?es comme des
> variables. Donc une fonction peut ?tre pass?e en param?tre ? une autre
> fonction, r?cup?r?e en param?tre de retour etc.
>
> Haskell supporte les fonctions anonymes et les fonctions ? lambda ?.
> Cela permet par exemple de d?crire une fonction (simple) dans la zone
> de param?tres d'une autre fonction.
> Un bon exemple vaut mieux qu'un long discours :
>
> map (+1) [1..10]
>
> map est une fonction ? 2 arguments : une fonction et une liste (ici
> [1..10]). Comme on peut s'y attendre, map applique la fonction ? tous
> les ?l?ments de la liste et retourne une liste r?sultante.
> Mais mais mais ??? ? (+1) ? c'est une fonction ? Eh bien oui, c'est
> une fonction anonyme (je ne l'ai pas d?clar?e avec un petit nom).
>
> Et la fonction ? + ? prend bien 2 arguments ? Je n'en voit qu'un (le 1
> dans l'exemple)? Il s'agit du m?canisme d' ? ?valuation partielle ? de
> Haskell. Si vous avez une fonction de 2 param?tres et que vous
> fournissez les 2 param?tres, super.
> Mais si vous ne fournissez qu'un param?tre, le r?sultat de l'op?ration
> sera? Une fonction bien sur ! Une fonction de l'autre param?tre.
> Et cette fonction ? un param?tre est ce qu'attend la fonction map.
> Alors, quel est le r?sultat de cette ligne de code ? ;)
>
> Haskell supporte la curryfication. Cette op?ration, du nom de son
> inventeur, est ? la base d'Haskell. D'ailleurs, devinez le pr?nom de
> ce Mr Curry? Haskell bien sur !!
>
> Il existe bien s?r une alg?bre sur les fonctions : l'addition, la composition?
et la multiplication qui facilitent un style de programmation
"point-free" [avec exemple?]
[Mais la somme et le produit cat?goriques de fonctions sont un peu
complex pour cette introduction, peut-?tre qu'il vaut mieux omettre
mention de l'addition enti?rement.]
> Vous pouvez donc d?finir une fonction en une ligne par simple
> composition de
[omis: deux autres]
> fonctions ? l'aide de l'op?rateur rond ? ?
> ?. Ce qui rend les choses assez lisible : dans un gros programme les
> fonctionnalit?s de haut niveau sont souvent cass?s en plusieurs
> fonctions plus simple. Une fois d?finis les fonctions simples, vous
> les ressemblez en une ligne avec l'op?rateur rond.
La composition de fonctions ?tant toujours associative, on n'a m?me pas
besoin de parenth?ses.
> Haskell est statiquement et fortement typ?. Le syst?me de typage est
> tr?s ?volu?, et vous ?vitera de nombreuses erreurs de programmation.
>
> Je termine par le plus dur :
> Haskell est un langage fonctionnel ? pure ?.
> Cela signifie qu'il n'y a aucuns effets de bords, et donc qu'il ne
> supporte pas l'affectation.
>
> Par exemple dans un programme en C, je pourrais avoir l'instruction suivante :
>
> a = f + g
>
> f et g sont des fonction, a un entier.
> Dans le cadre d'un refactoring, je pourrais ?tre amen? ? vouloir ?crire :
>
> a = g + f
>
> Eh bien ce n'est ? priori pas possible car en C comme dans d'autres
> langages, les fonctions ont des effets de bord : f peut modifier le
> contexte qui sera utilis? par g.
>
> En Haskell, le retour d'une fonction d?pend uniquement de ses
> param?tres, de rien d'autre.
> Si vous l'appelez ? n'importe quel moment avec les m?mes param?tres,
> le r?sultat sera le m?me.
> Cela donne une tr?s grande plasticit? et maintenabilit? au programme.
> Tout devient plus clair !
> Mais il faut reconna?tre que les programmes sont plus difficiles ? ?crire.
>
> Cette aspect ? pas d'affectation ? ouvre la porte ? de nombreuses
> fonctionnalit?s impossible sans, dont la paresse.
> A noter aussi que comme cons?quence, l'ordre des instructions n'a pas
> d'importance? Haskell est uniquement d?claratif.
Les b?n?fices d'un langage sans effects de bord ne peuvent que
s'accro?tre avec l'arriv?e des CPUs multiprocesseurs modernes.
> Haskell int?gre aussi de nombreuses autres fonctionnalit?s que je n'ai
> malheureusement pas le temps de d?velopper ici, dont :
> - la compr?hension de listes
> - le pattern matching pour les param?tres
> - les monades et les classes de types?
>
>
>
> R?f?rences :
> www.haskell.org
> http://en.wikipedia.org/wiki/Haskell_(programming_language)
>
> Ouvrages de r?f?rence :
> Yet Another Haskell Tutorial
> A Gentle Introduction to Haskell
>
> Contrairement ? ce que son nom indique, ce dernier ouvrage n'est pas
> gentil du tout, commencez plut?t par :
> Haskell for C Programmers
> _______________________________________________
> Haskell-fr mailing list
> Haskell-fr@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-fr
>
>
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic