Toutes les actions sont faites par l’évaluation d’expressions menant à des valeurs.
Par exemple inc (inc 3)
donne 5
.
Les valeurs sont des entités abstraites comme 5, 'a', [1,2,3], ('b',4), inc
.
Les fonctions sont définies sous forme équationnelle
inc n = n + 1
.
Toutes les valeurs (y compris les fonctions) sont first-class. Elles peuvent être passés comme arguments à des fonctions, retournées comme résultats, placées dans des structures de données, etc.
Les structures de données sont toujours figées (immutable).
Les expressions n’ont jamais d’effets de bord (comme modifier des variables globales ou effectuer des entrées-sorties). Leur évaluation mènera toujours au même résultat.
Le parallélisme est plus direct quand l’évaluation d’une expression est indépendante des autres.
La forme équationnelle permet de mieux raisonner sur les programmes. Comme en algèbre, on peut toujours remplacer la partie gauche d’une equation par sa partie droite dans une seconde équation :
inc (inc 3) = inc (3 + 1) = (3 + 1) + 1 = 5
.
En Haskell, les expressions ne sont pas évaluées tant que leur valeur n’est pas requise:
inc (3 + 1)
est évalué en (3 + 1) + 1
et non inc 4
!
Par exemple, v = 1/0
ne produit aucune erreur, car cela signifie v est défini comme étant 1/0,
plutôt que calculer 1/0 et stocker le résultat dans v. Ce n’est que lorsque v
sera utilisé
(test d’égalité, affichage, etc.) que l’erreur surviendra.
Par conséquent, il est possible :
Comme tous les langages fonctionnels, Haskell est particulièrement adapté aux tâches de compilation nécessitant une structure d’arbre fixe, mais une diversité croissante d’opérations pour ajouter de nouvelles transformations.
Haskell est particulièrement adapté pour accueillir des langages dédiés à des tâches précises, sous la forme d’un ensemble de types et de fonctions à combiner pour résoudre un problème spécifique.
Par exemple diagrams un langage déclaratif en Haskell pour les graphiques vectoriels.
Le projet
de l’an passé est un autre exemple.
Qui utilise un langage dans lequel les variables ne varient pas, dans lequel on ne peut rajouter une instruction d’affichage, sans changer le type de la fonction ?
Consultez par exemple cette liste qui répertorie des entreprises qui utilisent Haskell.
.hs
).ghc fichier.hs -o executable
produit
directement un exécutable : ./executable
.-c
pour compiler sans édition de lien et
-outputdir build
pour mettre les fichiers intermédiaires dans un répertoire séparé build
(voir man ghc
ou ghc --help
).GHCi est un REPL (Read-Eval-Print-Loop) qui accompage GHC.
Vous pouvez évaluer des expressions,
demander le type d’une expression avec :type
(:t
),
charger des fichiers Haskell avec :load
(:l
) et :reload
(:r
),
et bien plus encore (:?
pour une liste des commandes disponibles).
Comme les entrées-sorties ne sont pas évidentes en Haskell
(à cause de la paresse et de la pureté du langage),
nous allons d’abord surtout utiliser ce mode interactif en tapant ghci
.
programme
.Relancez plusieurs fois le programme précédent avec les instrutions suivantes:
Vous avez en main le compilateur d’un langage dédié pour réaliser des traces en SVG.