111 votes

Quel est le problème avec Haskell?

Je connais quelques programmeurs qui parlent sans cesse de Haskell quand ils sont entre eux, et ici sur SO, tout le monde semble aimer ce langage. Être bon chez Haskell semble un peu comme la marque d'un programmeur de génie.

Quelqu'un peut-il donner quelques exemples Haskell qui montrent pourquoi il est si élégant / supérieur?

139voto

Artelius Points 25772

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:

  1. Une meilleure conception des programmes. Réduction de la complexité se traduit par moins d'erreurs de logique.

  2. Code Compact. Moins de lignes pour les bugs existent.

  3. 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.

135voto

Edward Z. Yang Points 13760

La façon dont il a été lancé à moi, et ce que je pense est vrai, après avoir travaillé sur l'apprentissage sur Haskell depuis un mois maintenant, c'est le fait que la programmation fonctionnelle rebondissements votre cerveau de manière intéressante: il vous oblige à réfléchir à des problèmes familiers de différentes façons: au lieu de boucles, de penser à des cartes et des plis et des filtres, etc. En général, si vous avez plus d'un point de vue sur un problème, il vous rend plus à même de raisonner sur ce problème, et le commutateur de points de vue que nécessaire.

L'autre seule chose vraiment bien sur Haskell est son type de système. Il est strictement tapé, mais le type de moteur d'inférence en fait un programme en Python qui comme par magie vous dit quand vous avez fait une stupide liées à un type d'erreur. Haskell messages d'erreur à cet égard sont en manque un peu, mais comme vous obtenez plus d'familiariser avec la langue que vous allez dire à vous-même: c'est ce que le typage est censé être!

66voto

Brian Points 82719

Vous êtes gentil de poser la mauvaise question.

Haskell n'est pas une langue où vous allez regarder un peu les frais d'exemples et d'aller "ah, je vois maintenant, c'est ce qui le rend bon!"

C'est plus comme, nous avons tous ces autres langages de programmation, et ils sont tous plus ou moins similaires, et puis il y a Haskell qui est totalement différent et loufoque dans un sens, c'est totalement génial une fois que vous vous habituez à les délires. Mais le problème est, il prend un certain temps pour s'acclimater à l'saugrenu. Choses qui Haskell en dehors de presque tous les autres, même semi-langue dominante:

  • Évaluation différée
  • Pas d'effets secondaires (tout est pur, IO/etc passe par les monades)
  • Incroyablement expressif système de type statique

ainsi que certains autres aspects qui sont différents à partir d'intégrer de nombreuses langues (mais partagé par certains):

  • fonctionnelle
  • d'importants espaces
  • type inféré

Comme certains autres affiches ont répondu, la combinaison de toutes ces caractéristiques qui signifie que vous pensez au sujet de la programmation d'une manière entièrement différente. Et donc c'est difficile de trouver un exemple (ou d'un ensemble d'exemples) qui communique adéquatement ce Joe-mainstream-programmeur. C'est une expérience de la chose. (Pour faire une analogie, je peux vous montrer des photos de mes 1970 voyage à la Chine, mais après avoir vu les photos, vous ne parvenez toujours pas à savoir ce que c'était que d'avoir vécu pendant ce temps-là. De même, je peux vous montrer un Haskell 'quicksort", mais vous ne savez pas ce que cela signifie d'être un Haskeller.)

26voto

gtd Points 7062

Ce qui distingue vraiment Haskell à part, c'est l'effort qu'il va dans sa conception à appliquer de la programmation fonctionnelle. Vous pouvez programmer dans un style fonctionnel dans à peu près toutes les langues, mais il est trop facile d'abandonner à la première commodité. Haskell ne vous permet pas d'abandonner la programmation fonctionnelle, donc vous devez les prendre à sa conclusion logique, qui est un programme final c'est plus facile de raisonner sur, et laisse de côté toute une classe de la plus épineux types de bugs.

Quand il s'agit de l'écriture d'un programme pour l'utilisation dans le monde réel, vous pouvez trouver Haskell manque dans certains cas pratiques, de la mode, mais votre solution finale sera mieux pour les avoir connus Haskell pour commencer. Je ne suis certainement pas encore là, mais jusqu'à présent, apprendre Haskell a été beaucoup plus instructif que de dire, Lisp était au collège.

22voto

Don Stewart Points 94361

Une partie de ces histoires est que la pureté et le typage statique permettre de parallélisme agressive des optimisations. En parallèle langues sont chaud maintenant avec multicœur être un peu gênant.

Haskell vous donne plus d'options pour le parallélisme que pratiquement n'importe quel langage de programmation généraliste, avec un rapide, code natif compilateur. Il n'y a vraiment pas de concurrence à ce type de soutien en parallèle styles:

Donc, si vous vous souciez de faire de votre multicœur travail, Haskell a quelque chose à dire. Un excellent endroit pour commencer est avec Simon Peyton Jones tutoriel sur la programmation parallèle et concurrente en Haskell.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X