[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