Quels sont les avantages d'utiliser LISP et Haskell? Vont-ils faire de moi un meilleur programmeur? [fermé]

41

Je sais que Lisp et Haskell sont respectivement des langages de programmation logique et fonctionnel, mais qu'est-ce que cela signifie exactement? Comment diffèrent-ils des autres langues? J'ai entendu dire que leur apprentissage ferait de vous un meilleur programmeur et améliorerait votre logique. Est-ce vrai et si j'apprends le Lisp ou le Haskell à un niveau compétent, ma programmation s'améliorera et serai-je mieux à même de traiter n'importe quel problème dans n'importe quelle langue? Je voulais juste savoir pour voir s'ils valaient la peine d'apprendre. Ces langages sont-ils également utiles dans des domaines tels que l'interface graphique et les graphiques, ou sont-ils simplement utiles pour les applications console?

Logan545
la source
36
Utiliser LISP et Haskell fera de vous un meilleur programmeur LISP et Haskell, je vous le garantis.
Neil
17
@MasonWheeler, je dois dire; Il y a beaucoup de choses dans le système de typage de Haskell que vous ne trouverez pas dans une autre langue, et les macros LISP sont introuvables dans les langues courantes. Ces deux choses sont l' apprentissage vaut la peine parce qu'ils ne font de vous un meilleur programmeur dans votre langue de travail. Au moins, cela a été mon expérience; Haskell a fait de moi un meilleur développeur C # d'entreprise. Je connais parfaitement des techniques pour mettre en œuvre la séparation des problèmes que je n'aurais jamais eu autrement, et l'analyse des problèmes sera toujours beaucoup plus simple pour moi qu'avant l'apprentissage de Haskell.
Jimmy Hoffa
6
Erlang est un langage fonctionnel. Rabbit MQ est écrit en Erlang et Rabbit est utilisé dans de nombreux endroits pour effectuer de nombreuses tâches difficiles. Les langages fonctionnels vous apprennent à penser différemment en matière de programmation, ce qui est un outil supplémentaire très utile. S'il est vrai que certains de ces concepts ont été intégrés à des langages plus populaires (par exemple, les expressions lambda en C # et C ++), vous abordez toujours la résolution de problèmes de manière très différente lorsque vous utilisez un langage fonctionnel.
Binary Worrier
8
@MasonWheeler Il y a de bonnes raisons qu'une langue soit plus utile que le reste, mais qu'elle ne soit pas encore largement utilisée. Je peux en penser plusieurs: base d'utilisateurs existants, changement trop radical, quand "bien, c'est assez bien", et aussi ... quand le meilleur outil nécessite des programmeurs mieux formés. Donc, la popularité n'est pas une bonne mesure de l' utilité .
Andres F.
5
@MasonWheeler Pour utiliser une analogie, les mathématiques sont un domaine extrêmement utile dans la vie réelle. Alors, pourquoi plus de gens ne maîtrisent pas les mathématiques? Pourquoi beaucoup de gens en ont-ils peur et pensent que c'est de la magie noire et pas vraiment utile?
Andres F.

Réponses:

37

C'est comme si l'apprentissage des mathématiques améliorait vos compétences analytiques et que l'apprentissage de la littérature latine / classique améliorait vos compétences en écriture.

Les personnes qui ont conçu ces langues ont réfléchi à ce que signifie écrire un programme. Et ces langues sont les résultats de ces recherches.

Cela dit, l'apprentissage de Java fera également de vous un meilleur programmeur. Et apprendre C. Les avantages réels proviennent de l’apprentissage de langues avec une philosophie différente. Vous pourrez alors avoir votre propre opinion sur la manière dont un programme devrait être écrit.

modifier

Je me rends compte que cette réponse n’est pas très utile pour les personnes qui n’ont pas encore appris le haskell et / ou le lisp. Voici quelques exemples pour expliquer davantage ce que je veux dire

ZÉZAYER

Lisp pense que la syntaxe devrait être minimale et que tout devrait être une liste ou une primitive (Lisp signifie Traitement de liste). Même les programmes sont principalement des listes contenant d’autres listes et symboles. Lisp vous permet de manipuler des programmes sous forme de liste et de générer de nouveaux programmes à la volée. D'où toute la code is data and data is codedevise.

La conséquence directe est que les langages Lisp vous permettent de définir l’interface de votre choix. Un bon exemple est compojure, qui est un framework web de clojure. Voici à quoi ressemble une fonction de routage

(defroutes app-routes
  (GET "/" [] view/page)
  (GET "/api" [] (wrap-aleph-handler api/socket-handler))
  (route/resources "/static")
  (route/not-found "page not found"))

Un autre bel exemple est le framework de création de hiccup:

(html [:ul
  (for [x (range 1 4)]
    [:li x])])

Comme vous pouvez le constater, le résultat est aussi succinct que dans DSL comme moustache, mais vous permet d’utiliser les fonctionnalités du langage telles que (for [x (range 1 4)] block). Encore plus agréable, vous avez tous les outils pour résumer et structurer votre code.

Dans d'autres langues, la syntaxe est plus complexe. Vous ne pouvez pas lire un programme Java en tant que groupe de listes. Mais en utilisant Lisp, vous avez une meilleure idée de ce à quoi devrait ressembler une interface idéale et de ce que votre code peut être extrait sous forme de données. Cela vous aide également à voir votre langue préférée comme une grande structure de données et à mieux comprendre sa sémantique.

Haskell

Haskell croit au typage statique fort et à la pureté. Les fonctions pures ressemblent aux fonctions mathématiques: elles sont définies sur un ensemble de valeurs et mappées sur un autre ensemble. Les fonctions n'ont pas d'effets secondaires et les valeurs sont immuables. La pureté est intéressante parce que ce n'est pas quelque chose qu'un langage multi-paradigme peut avoir. Une langue est pure ou non.

Une conséquence est que vous ne pouvez pas effectuer d'action IO quand vous le souhaitez (Haskellers pense que c'est une bonne chose). Les actions IO sont définies comme des transactions, qui sont elles-mêmes des valeurs pures. La mainvaleur d'un programme haskell est une transaction IO exécutée lorsque vous exécutez le programme.

Vous devez traiter explicitement du flux de données dans votre programme. Vous ne pouvez pas faire communiquer deux composants en écrivant et en lisant des éléments dans une variable globale. Vous devez construire et transmettre des valeurs.

Une autre caractéristique mentionnée par Jimmy Hoffa est le système de type riche. Tandis que d'autres langues utilisent le typage statique, dans haskell vous pouvez avoir des choses comme:

length :: [a] -> Int (fonction d'une liste de a à un int)

map :: (a -> b) -> [a] -> [b](fonction qui prend une a to btransformation et une liste de a, et retourne une liste de b)

La bonne chose est que je n'ai pas besoin d'expliquer ce que ces fonctions font réellement: vous comprenez déjà leur comportement. De plus, les fonctions portant ces signatures ne peuvent en réalité que calculer la longueur d'une liste et mapper une transformation sur une liste.

Dans d'autres langages typés, les hiérarchies de classes associées à la mutabilité font de la gestion de ces types un cauchemar. Vous devez comprendre des choses telles que la covariance et la contravariance, impossibles à comprendre du point de vue linguistique (c.-à-d. Simple, puissant et sûr).

Soit vous prenez le chemin sûr (comme scala) et vous vous retrouvez avec un langage très complexe, soit vous prenez le chemin simple et obtenez quelque chose qui est soit limité (google go génériques limités à la liste et aux cartes) ou peu sûr covariant).

En utilisant haskell, vous découvrez principalement les avantages de la pureté et comment écrire du code pur.

Simon Bergot
la source
1
@ JimmyHoffa Je pense que cela mérite sa propre réponse, car c'est ce que les gens ont tendance à négliger. Il existe des domaines problématiques qui sont mieux résolus par la programmation fonctionnelle que les gens ne réalisent même pas qu'ils existent avant d'avoir au moins abordé ces domaines en dehors de leur zone de confort.
KChaloux
2
Je ne sais pas pour l'Assemblée, et je n'en ai pas parlé non plus. Cependant, assembly peut vous aider à comprendre le fonctionnement de vos programmes. Il y a d'excellents articles sur SO des personnes capables d'analyser un assemblage généré afin d'expliquer un problème de performances.
Simon Bergot
3
@KChaloux J'écrirais la réponse mais cette question devrait être close (j'ai fermé voté en conséquence). En termes simples, je pourrais écrire mon opinion et mon expérience dans une réponse, mais cela ne serait pas plus juste ou faux que les autres réponses, le problème étant la question de la recommandation linguistique et la raison pour laquelle j'ai voté pour la clôture.
Jimmy Hoffa
7
OMG, @Neil savoir ce que l'ordinateur est en train de faire assurément vous fera un meilleur programmeur. Je n'ai pas écrit assemblage depuis des années, mais je le lis régulièrement (sur de nombreuses plateformes) et si vous vous souciez de la façon dont votre programme fonctionne réellement, il est essentiel de connaître au moins les bases.
dash-tom-bang
3
@ Neil, dans quel cas le fait d'être un pire programmeur est-il un avantage? Qu'est-ce qui vous fait parler de code spaghetti? Qu'est-ce que le code spaghetti a à voir avec l'assemblage ou d'être un bon programmeur, sauf dans le monde fantastique de ne pas connaître l'assemblage et d'avoir besoin d'une rationalisation pour éviter de l'apprendre? Au contraire, être un bon codeur d’assemblage fait bien prendre conscience des mauvaises pratiques de codage.
dash-tom-bang
12

tl; dr Apprendre de nouvelles choses ne peut que faire de vous un meilleur programmeur, mais être un meilleur programmeur ne concerne pas les langues dans lesquelles vous pouvez écrire du code.

Quels sont les avantages d'utiliser LISP et Haskell?

ZÉZAYER:

  1. Code homoiconique. Cela permet au code structuré de s'auto-modifier.
  2. Macros compatibles avec la syntaxe. Ils permettent la réécriture du code standard.
  3. Pragmatisme. CL est conçu pour permettre aux professionnels de travailler de faire le nécessaire. La plupart des langages fonctionnels ne le sont généralement pas.
  4. Souplesse. Il peut faire beaucoup de choses différentes, toutes à une vitesse raisonnable.
  5. La verrue Le monde réel est en désordre. Le codage pragmatique finit par devoir utiliser ou inventer des constructions en désordre. Common Lisp a suffisamment de sang-froid pour pouvoir accomplir des tâches.

On peut soutenir que les seules vraies raisons de choisir CL sont le fait que les bibliothèques standard sont datées.

Je vais m'exprimer et dire que dans le cas général, la syntaxe ne devrait pas être un problème pour un informaticien professionnel.

De: Pourquoi Lisp est-il utile?

Haskell:

Haskell est un langage de programmation informatique. En particulier, il s’agit d’un langage purement fonctionnel, typé polymorphiquement, statiquement, et très différent de la plupart des autres langages de programmation. Le langage porte le nom de Haskell Brooks Curry, dont les travaux en logique mathématique servent de fondement aux langages fonctionnels. Haskell est basé sur le calcul lambda, d'où le lambda que nous utilisons comme logo.

Vous pouvez y lire une description de Functional vs imperative

De: http://www.haskell.org/haskellwiki/Introduction

Vont-ils faire de moi un meilleur programmeur?

Oui, bien sûr, connaître davantage de langues et de paradigmes ne peut que faire de vous un meilleur programmeur, mais comprenez bien ceci:

Il n'y a pas un seul outil, un seul livre, un seul paradigme de programmation qui fera de vous un meilleur programmeur.

Apprendre différents langages de programmation avec différents paradigmes vous aidera certainement à être un meilleur programmeur, apprendre à résoudre des problèmes avec des approches différentes bénéficiera également grandement à votre pensée logique.

Être un bon programmeur, ce n’est pas une question de langue, mais bien d’être capable de résoudre tout problème, quelle que soit sa langue. Et lorsque vous ne connaissez pas la langue, vous pourrez apprendre cette langue rapidement et l'utiliser efficacement.

Je pense que plus votre pensée est globale, meilleur est votre développeur.

Par exemple, vous pouvez ajouter des commentaires utiles à votre code, vous soucier de la lisibilité de votre code, de sa maintenabilité. Faites attention aux petits détails. Réfléchissez avant de taper!. En savoir plus sur les modèles de conception. Suivez les bonnes pratiques.

Divulgation: Il s'agit d'une publicité sans vergogne du pire type, car elle provient de mon blog.

Jsedano
la source
4
Avez-vous appris LISP ou Haskell à un niveau compétent?
Jimmy Hoffa
10
C'est un peu malhonnête d'entendre cela de la part de quelqu'un qui ne sait presque rien de l'une ou l'autre langue. Vous prétendez qu'ils ne sont pas des outils dont vous avez besoin pour le moment, mais vous ne savez pas à quoi ils servent, alors comment pouvez-vous savoir cela? De plus, comment pouvez-vous conseiller à quelqu'un ce qu'il va apprendre ou non d'eux? Autant que vous sachiez, LISP est un dérivé de SQL uniquement utile pour l'analyse de données relationnelles et Haskell pourrait être un sous-ensemble strict de Regexp.
Jimmy Hoffa
10
Cela ne répond pas vraiment à la question. Vous avez réussi l'exploit impressionnant de donner une réponse vague à une question sur deux langues que vous ne connaissez pas: /
Andres F.
2
-1 parce que cela danse vaguement autour de ce que vous apprennent exactement Common Lisp et Haskell. Exemples: Code en tant que Données Données en tant que code, pureté, transparence référentielle, abstractions monadiques, programmation fonctionnelle, programmation orientée langage, programmation orientée type, etc. etc.
Daniel Gratzer
3
En outre, ne sachant ni l'une ni l'autre langue, je ne pense pas que vous puissiez répondre à cette question: / Désolé
Daniel Gratzer le
9

Lorsque vous apprenez des langues qui ne font pas partie du paradigme que vous utilisez habituellement, cela vous ouvrira l'esprit à des solutions alternatives au quotidien et vous aidera peut-être même à mieux comprendre certaines caractéristiques de la langue de votre choix. Le simple fait de connaître ces langues ne fera pas de vous un meilleur programmeur si vous ne pouvez pas tirer les leçons que vous avez apprises de ces langues et les appliquer à des situations que vous voyez tous les jours.

Cela étant dit, cela ne se limite pas aux langues. Lorsque vous lisez des informations sur diverses structures de données que vous n'avez pas vues ou utilisées auparavant, cela peut vous aider à élargir votre champ de connaissances afin que la prochaine fois que vous rencontrez un problème, vous disposiez d'une solution supplémentaire.

Jetti
la source