C'est l' exemple qui m'a convaincu de m'apprendre Haskell (garçon et je suis heureux que j'ai fait).
-- program to copy a file --
import System
main = do
--read command-line arguments
[file1, file2] <- getArgs
--copy file contents
str <- readFile file1
writeFile file2 str
OK, c'est un court, lisible programme. En ce sens, c'est mieux qu'un programme C. Mais comment est-ce si différent de (disons) un programme en Python avec une structure très semblable?
La réponse est paresseux évaluation. Dans la plupart des langues (même certains fonctionnelle), un programme structuré comme celui ci-dessus, l'intégralité du fichier chargé en mémoire, puis écrit à nouveau sous un nouveau nom.
Haskell est "paresseux". Il ne parvient pas à calculer les choses jusqu'à ce qu'il doit, et, par extension, ne pas calculer les choses il faut jamais. Par exemple, si vous deviez supprimer l' writeFile
ligne de, Haskell ne serait pas la peine de lire quoi que ce soit à partir du fichier dans la première place.
Comme il est, Haskell se rend compte que l' writeFile
dépend de l' readFile
, et est donc capable d'optimiser ce chemin de données.
Alors que les résultats sont compilateur-dépendante, ce qui se produit généralement lorsque vous exécutez le programme ci-dessus est le suivant: le programme lit un bloc (disons 8 KO) du premier fichier, puis l'écrit 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 d'exécuter strace
sur!)
... qui ressemble beaucoup à ce que l'efficacité de C mise en œuvre de la copie d'un fichier ferait.
Donc, Haskell permet d'écrire compact, lisible programmes - souvent sans sacrifier beaucoup de la performance.
Une autre chose que je doit ajouter, c'est que Haskell ne le rend difficile l'écriture de buggy programmes. L'incroyable système de type, l'absence d'effets secondaires, et bien sûr la compacité du code Haskell réduit de bugs pour au moins trois raisons:
Une meilleure conception des programmes. Réduction de la complexité se traduit par moins d'erreurs de logique.
Code Compact. Moins de lignes pour les bugs existent.
Les erreurs de compilation. Beaucoup de bugs juste ne sont pas valides Haskell.
Haskell n'est pas pour tout le monde. Mais tout le monde devrait essayer.