Haskell

Gelose | Tous les portails | Portail Medecine | Portail Biologie | Portail Biochimie | Portail Microbiologie | Portail Ecologie | Portail Botanique | Biologie cellulaire | Portail Zoologie | Science de la terre | Portail Eau |


 Inscrivez votre site en haut de cette page Soumission direct par Allopass, obtenez 1 lien de qualite en haut de cette page Haskell ainsi que sur la page des nouveaux sites inscrits pour seulement 20 euros!


image:Langage_progr.pngimage:Langage_progr.png
Cet article fait partie de la série
Langages de programmation
Langages à objets
C++ - C#
Delphi - Eiffel - Java
Groovy - Python - Ruby
Simula - Smalltalk
Visual Basic - WinDev
Langages impératifs
APL - ASP - Assembleur
BASIC - C - Cobol
Forth - Fortran - Logo
Pascal - Limbo - Perl - PHP
Langages fonctionnels
Haskell - ML/OCaml
Lisp/Common Lisp
Scheme
XSLT
Langages déclaratifs
Clips - Prolog
Langages concurrents
Ada 95 - Erlang
Langage de balisage
HTML - SGML - XML
S-expressions
Voir aussi
Conception - Codage
Tests - Optimisations

Haskell est un langage de programmation fonctionnel, comme Lisp. Il est fondé sur le lambda-calcul et la logique combinatoire. Son nom vient de celui du mathématicien et logicien Haskell Brooks Curry. Il a été créé en 1985. Le dernier standard semi-officiel est Haskell 98, c'est une version minimale et portable du langage conçue à des fins pédagogiques et comme base de futures extensions. Le langage continue d'évoluer rapidement, avec Hugs et GHC (voir ci-dessous), constituant ainsi le standard de facto.

Les fonctionnalités les plus intéressantes de Haskell sont le support pour les fonctions récursives, l'inférence de types, les listes en compréhension et l'évaluation paresseuse. Ces fonctionnalités, surtout si on les combine, rendent facile l'écriture des fonctions. Haskell se distingue également par l'utilisation de monades pour les entrées/sorties. En 2002, c'est probablement le langage fonctionnel sur lequel le plus de recherches ont été entreprises. Plusieurs variantes ont été développées. Des versions parallélisées faites au Laboratory for Computer Science du MIT et à l'Université de Glasgow ont toutes deux été appelées Parallel Haskell. Des versions plus parallélisées et plus distribuées sont appelées Distributed Haskell (anciennement Goffin) et Eden. Une version d'exécution spéculative, Eager Haskell et plusieurs versions orientées objets, Haskell++, O'Haskell et Mondrian ont vu le jour.

Il existe aussi un langage similaire au Haskell qui offre un support pour la création de GUI, le Concurrent Clean.

Une version éducative de Haskell appelée Gofer a été développée par Mark Jones, et a finalement été supplantée par HUGS, le Système Gofer de l'Utilisateur Haskell (Haskell User's Gofer System).

Sommaire

[] Exemple de code

[] Fonction factorielle (récursive)

La définition classique de la fonction factorielle :
fac 0 = 1
fac n = n * fac (n - 1)

[] Fonction factorielle (avec product)

La définition élégante de la fonction factorielle (qui utilise la fonction Haskell product et la notation sur les listes) :
fac n = product [1..n]

[] Fonction Fibonacci (naïve)

Une implémentation naïve de la fonction qui retourne le n-ième nombre de la Suite de Fibonacci :
fib 0 = 0
fib 1 = 1
fib n = fib (n - 2) + fib (n - 1)

[] Fonction Fibonacci (seconde version)

Une fonction qui retourne la liste des nombres de Fibonacci en un temps linéaire :
fibs = 0 : 1 : (zipWith (+) fibs (tail fibs))

La fonction précédente crée une liste infinie, ce qui est tout à fait possible grâce à l'évaluation paresseuse.

[] Fonction Fibonacci (troisième version)

On peut aussi implémenter fib de cette manière:
fib n = fibs !! n
(!! est un operateur qui retourne le n-ième élément d'une liste).

[] Fonction du tri rapide (quicksort)

L'algorithme du tri rapide peut être élégamment écrit en Haskell avec l'aide de la manipulation de listes :
qsort []     = []
qsort (x:xs) =
  qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
  where
    elts_lt_x   = [y | y <- xs, y < x]
    elts_greq_x = [y | y <- xs, y >= x]
(Notez qu'à cause des nombreuses copies et concaténations de listes, ce code peut être vraiment lent, ceci dépendant de l'implémentation)

[] Implémentations

Les implémentations suivantes sont toutes compatibles (ou presque compatibles) avec le standard Haskell 98, et sont distribuées sous licences libres. Il n'y a pas d'implémentation commerciales de Haskell à ce jour.

  • Hugs est un interpréteur bytecode. Il offre une compilation rapide et une vitesse d'exécution raisonnable. Il possède aussi une bibliothèque graphique simple. Hugs se prête bien à l'apprentissage de Haskell, mais il ne faut pas en déduire que Hugs est une implémentation simpliste. C'est la plus portable et la plus légère des implémentation de Haskell.
  • GHC. Le Compilateur Haskell de Glasgow (Glasgow Haskell Compiler) compile le code en natif sur nombre d'architectures, et compile aussi en C. GHC est probablement le plus populaire des compilateurs Haskell, et il contient des bibliothèques très utiles (par exemple des bindings pour OpenGL) qui ne marchent qu'avec GHC.
  • nhc98 est un autre interpréteur bytecode, mais le bytecode s'exécute plus vite qu'avec Hugs. Nhc98 se concentre sur un usage minimal de la mémoire, et c'est un choix recommandé pour les vieilles machines.
  • HBC est un autre compilateur natif. Il n'est plus développé depuis quelque temps, mais il reste encore utilisable.

[] Quelques succès d'Haskell

Parce que non-procédural, Haskell permet de limiter considérablement les besoins de débogage ; il arrive donc que des projets soient réalisés en Haskell avant d'être disponibles dans d'autres langages. Les deux exemples les plus connus sont :

  • le programme nget, permettant de récolter toutes les images d'un newsgroup Usenet, dont la première version fut codée en Haskell (une version en langage C fut ensuite développée pour en faciliter le portage).
  • Pugs, implémentation de Perl 6 rendue disponible bien avant la sortie officielle de la version du langage fondée sur la machine virtuelle Parrot (elle-même toujours pas disponible en juin 2006).

[] Voir aussi

[] Liens externes

Voir aussi sur Wikilivres :
Haskell (Anglais).
Haskell