Duplicata possible:
Haskell vs programmation procédurale dans le monde réel
Quelques fois, j'ai entendu des gens dire des choses comme "Chaque programmeur devrait connaître Haskell", "Vous n'êtes pas programmeur si vous ne connaissez pas haskell" et ainsi de suite. Cependant, je ne sais pas exactement si je devrais essayer de comprendre brièvement cette langue ou non. Jouer avec un interprète (pour obtenir une compréhension intuitive des bases) prendra au moins quelques jours (voire des semaines), et je ne sais pas exactement si le résultat en vaudra la peine.
Un peu d'histoire (pour avoir une idée de mes connaissances)
J'ai commencé à programmer quand j'étais enfant (quelque part entre 10 ou 13 ans) avec une calculatrice programmable, je suis passé à l'assemblage de base, puis à un assemblage non x86 (réimplémenter la multiplication et la division, et écrire un pilote de souris auto-modifiable était amusant), Pascal, delphi, maintenant j'utilise C++ presque exclusivement. Connaître mon environnement Unix Shell, peut écrire des logiciels en python et probablement dans n'importe quoi (si j'ai un livre de référence à proximité) qui ressemble à distance à C++ ou Pascal (c.-à-d. Blocs, contrôle de flux similaire, etc.) La spécialisation est la programmation 3D et les shaders. "Fish in the water" avec des opérations de bas niveau (allocation de mémoire de style C, pointeurs), moins à l'aise avec une approche extrêmement OOP (c.-à-d. Lorsque les cours sont faits) pour le plaisir d'avoir des cours). Presque complètement autodidacte. C'est-à-dire certainement pas un débutant, mais il y a des domaines où je pourrais m'améliorer.
Alors ... qu'est-ce que je pourrais éventuellement gagner en étudiant Haskell à ce stade? Pour autant que je sache, ce langage n'est pas vraiment largement utilisé, par conséquent, il y a probablement moins de bibliothèques avec lesquelles il peut s'interfacer (comme c'était le cas avec la programmation Delphi - vous pouvez faire de la programmation DirectX en delphi, si vous voulez vraiment, mais vous pouvez n'écrivez pas le plugin 3dsmax/maya avec lui (enfin, c'est probablement théoriquement possible, mais ce ne sera certainement pas facile)). Je ne pense pas non plus que je pourrai facilement brancher un morceau de code Haskell dans le moteur de jeu.
Alors, quel genre de connaissances utiles je peux en tirer?
P.S. Je n'achèterai pas l'argument "si vous apprenez une autre langue, vous apprendrez probablement quelque chose qui sera probablement utile".
(C'est sûrement une question en double, mais je n'en trouve pas maintenant.)
Vous l'apprenez afin d'apprendre la programmation fonctionnelle pure, ce qui vous oblige à faire beaucoup de choses d'une manière complètement différente. Vous obtenez une nouvelle façon de penser. Programmation sans état? Programmation sans effets? Tout est paresseux? Système de type fou avec inférence de type? Que diable sont les monades? Votre esprit sera époustouflé à plusieurs reprises, mais à la fin vous sortez avec de nouvelles perspectives/techniques de programmation fonctionnelle qui sont difficiles à saisir autrement sans devenir Haskell à part entière.
Le problème en essayant d'être précis, c'est qu'en essayant de dire à un non-Haskeller ce qu'il va apprendre de Haskell, c'est comme essayer d'expliquer la couleur "verte" à un aveugle.
Il y a quelques années, beaucoup de gens ont été surpris de découvrir qu'un des cours d'introduction était enseigné en utilisant Haskell comme/le langage de programmation! Bien que je n'avais pas d'expérience avec Haskell, j'avais quelques connaissances en LISP et en d'autres langages de programmation fonctionnelle.
Je pense que l'anecdote montre à quel point les connaissances peuvent être utiles quand on s'y attend le moins.
En termes plus pratiques: vous avez peut-être remarqué que les vitesses du processeur ont atteint un mur il y a quelques années, et maintenant le moyen le plus pratique pour tirer plus de performances des ordinateurs est d'installer plusieurs processeurs. Maintenant, il se trouve que la plupart sinon tous les langages de programmation que vous connaissez sont essentiellement des tâches simples et soumis au goulot d'étranglement de Von Neumann . Une solution évidente est la programmation parallèle, mais cela peut être très douloureux si les parties parallèles de votre programme finissent par partager l'état, c'est-à-dire la mémoire - et c'est le plus souvent le cas.
Il s'avère que la programmation fonctionnelle est un style qui vous permet principalement de contourner les problèmes de programmation parallèle avec état partagé. Autrement dit, il est assez facile d'écrire des programmes dans le style FP qui sont "naturellement" sûrs pour les threads et adaptés au traitement parallèle. Selon la langue, le compilateur et le matériel que vous pouvez même trouver (comme je récemment) des parties de votre programme fonctionnant en parallèle sans jamais avoir fait de codage explicite pour le parallélisme.
Je me trompe souvent, mais je suppose que la programmation fonctionnelle se révélera être l'un des paradigmes de programmation à chaud de l'avenir alors que la programmation parallèle devient plus importante et plus difficile. Haskell peut ne pas s'avérer être la langue de choix - mon préféré est actuellement Clojure - mais cela peut valoir la peine de jeter un œil à une ou plusieurs langues FP FP).
Je ne pense pas non plus que je pourrai facilement brancher un morceau de code Haskell dans le moteur de jeu.
Si vous ne souhaitez écrire que des moteurs de jeux 3D, il est peut-être inutile de découvrir Haskell.
Si vous voulez être un programmeur complet capable de programmer dans plusieurs paradigmes et que vous ne connaissez actuellement que les langages de type C, cela vaut le coup d'œil.
Chaque fois que vous apprenez une nouvelle langue très différente, cela facilite l'apprentissage de la langue suivante, car vous ne mémorisez pas seulement une nouvelle syntaxe, vous apprenez également différentes façons de penser la programmation. Si vous essayez une nouvelle langue et que vous voyez une nouvelle fonctionnalité, vous la comprendrez plus rapidement si vous pouvez la relier à une autre fonctionnalité dans une langue que vous connaissez déjà. Plus vous connaissez de langues, plus il est probable que cette nouvelle fonctionnalité est similaire à quelque chose que vous avez vu auparavant.
Il est également pratique d'avoir de nombreux outils disponibles dans votre boîte à outils. Certains problèmes sont mieux résolus dans une langue que dans une autre. Si vous avez 5 types de langues très différents, vous pouvez sélectionner la meilleure pour chaque problème. Si vous ne connaissez que 2 ou 3 langues très similaires, certains problèmes seront faciles à résoudre, mais d'autres pourraient être plus difficiles que si vous utilisiez une langue meilleure pour cette tâche spécifique.
Si la programmation 3D est votre truc, vous pourriez être intéressé par quelques diapositives d'une conférence intitulée The Next Mainstream Programming Languages: A Game Developer's Perspective par Tim Sweeney, fondateur d'Epic et directeur technique du moteur Unreal . Il a parlé sur le sujet plusieurs fois , et il pense clairement très fortement à Haskell.
Il y a plusieurs choses que vous pouvez obtenir, principalement dans votre façon de penser les choses. Par exemple, il est intéressant de remarquer ce qu'est un langage minimal. Si vous passez par SICP (et les mêmes concepts s'appliquent également à Haskell), vous remarquerez que vous n'avez pas du tout besoin de la syntaxe de boucle. Vous n'avez pas besoin de fonctions prédéfinies qui fonctionnent sur des structures plus grandes. Vous pouvez définir à peu près tout ce dont vous avez besoin si vous avez un constructeur/déconstructeur contre, ou une façon de le définir, et la possibilité de récurrence des fonctions. Vous pouvez définir tout le reste vous-même - et c'est un exercice intéressant de le faire. Et ce n'est que la pointe de l'iceberg.
À un niveau plus pratique, par exemple, il y a quelques semaines, je faisais mes devoirs OCaml et gémissais "pourquoi cette langue $% $% # n'a-t-elle pas call/cc
!?!" Mon esprit a été sidéré quand j'ai remarqué ce que je pensais - je ne l'aurais jamais manqué si je ne savais pas ce que c'était, et je ne saurais pas ce que c'était si je ne jetais pas un œil à Scheme, Haskell, Rubis.
Vous pouvez trouver de nombreux exemples Nice au concours ICFP; celui qui m'a vraiment épaté était cette entrée à ce concours . Ils ont créé un nouveau langage à l'intérieur de Haskell pour résoudre leur problème.
Je dirais que si c'est une corvée, ne le fais pas. Sinon, commencez à lire this et vous devriez voir après 10 mn si vous vous ennuyez ou si vous êtes saisi et ne pouvez pas arrêter de le lire.
Apprendre un langage fonctionnel sera un vrai changement par rapport à ce à quoi vous êtes habitué. Alors oui, vous allez probablement apprendre quelque chose d'utile;)
Les langages fonctionnels comme Haskell sont une façon différente de penser un problème. Ils sont utiles pour l'apprentissage et l'enseignement des structures de données et des algorithmes, car ils simplifient ce type de problème.
Si vous utilisez la STL de C++, qui a des concepts fonctionnels similaires à Haskell et à d'autres langages, avoir une mise à la terre dans Haskell vous aidera à comprendre comment fonctionne la STL.
Si vous utilisez XSL: T pour transformer XML, c'est très fonctionnel dans sa conception.