C'est l' exemple qui m'a convaincu d'apprendre Haskell (et je suis content de l'avoir fait).
-- program to copy a file --
import System.Environment
main = do
--read command-line arguments
[file1, file2] <- getArgs
--copy file contents
str <- readFile file1
writeFile file2 str
OK, c'est un programme court et lisible. En ce sens, c'est mieux qu'un programme C. Mais en quoi est-ce si différent (disons) d'un programme Python avec une structure très similaire?
La réponse est une évaluation paresseuse. Dans la plupart des langages (même certains fonctionnels), un programme structuré comme celui ci-dessus entraînerait le chargement du fichier entier en mémoire, puis réécrit sous un nouveau nom.
Haskell est "paresseux". Il ne calcule pas les choses avant d'en avoir besoin et, par extension, ne calcule pas les choses dont il n'a jamais besoin. Par exemple, si vous supprimez lewriteFile
ligne, Haskell ne prendrait pas la peine de lire quoi que ce soit du fichier en premier lieu.
Dans l'état actuel des choses, Haskell se rend compte que le writeFile
dépend de lareadFile
, et peut donc optimiser ce chemin de données.
Bien que les résultats dépendent du compilateur, ce qui se passera généralement lorsque vous exécuterez le programme ci-dessus est le suivant: le programme lit un bloc (disons 8 Ko) du premier fichier, puis l'écrit dans le deuxième fichier, puis lit un autre bloc à partir du premier fichier et l'écrit dans le deuxième fichier, et ainsi de suite. (Essayez de courirstrace
dessus!)
... qui ressemble beaucoup à ce que ferait l'implémentation C efficace d'une copie de fichier.
Ainsi, Haskell vous permet d'écrire des programmes compacts et lisibles - souvent sans sacrifier beaucoup de performances.
Une autre chose que je dois ajouter est que Haskell rend simplement difficile l'écriture de programmes bogués. Le système de type étonnant, le manque d'effets secondaires et bien sûr la compacité du code Haskell réduisent les bogues pour au moins trois raisons:
Meilleure conception du programme. Une complexité réduite entraîne moins d'erreurs logiques.
Code compact. Moins de lignes sur lesquelles les bogues existent.
Compilez les erreurs. Beaucoup de bugs ne sont tout simplement pas valides Haskell .
Haskell n'est pas pour tout le monde. Mais tout le monde devrait essayer.