web-dev-qa-db-fra.com

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

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

42
Logan545

C'est un peu comme apprendre les mathématiques améliorera vos compétences analytiques et l'apprentissage de la littérature latine/classique améliorera 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 le résultat de ces recherches.

Cela dit, apprendre Java fera également de vous un meilleur programmeur. Et apprendre C. Les vrais avantages viennent de l'apprentissage de langages avec une philosophie différente. Ensuite, vous pouvez avoir votre propre opinion sur la façon dont un programme devrait etre ecrit.

Modifier

Je me rends compte que cette réponse n'est pas si 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 doit être minimale et que tout doit être soit une liste soit une primitive (LISP signifie List Processing). 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 devise code is data and data is code.

La conséquence directe est que les langages LISP vous permettent de définir n'importe quelle interface que vous souhaitez. Un bel exemple est compojure qui est un framework web 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 cadre de création de modèles de hoquet:

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

Comme vous pouvez le voir, le résultat est aussi laconique qu'en DSL comme la 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 qui, dans votre code, peut être résumé comme Il vous aide également à voir votre langue préférée comme une structure de Big Data et à mieux comprendre sa sémantique.

Haskell

Haskell croit en un typage statique fort et une pureté. Les fonctions pures sont comme des fonctions mathématiques: elles sont définies sur un ensemble de valeurs et mappées sur un autre ensemble. La fonction n'a pas d'effets secondaires et les valeurs sont immuables. La pureté est intéressante car 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 une action IO quand vous le souhaitez (haskellers pense que c'est une bonne chose). IO sont définies comme des transactions, qui sont eux-mêmes des valeurs pures. La valeur main d'un programme haskell est une transaction IO exécutée lorsque vous exécutez le programme.

Vous devez traiter explicitement le 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 créer et transmettre des valeurs.

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

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

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

Ce qui est bien, c'est que je n'ai pas besoin d'expliquer ce que font réellement ces fonctions: vous comprenez déjà leur comportement. De plus, les fonctions avec ces signatures ne peuvent vraiment rien d'autre 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 combinées à la mutabilité font du traitement de ces types un cauchemar. Vous devez comprendre des choses comme la covariance et la contravariance, qui sont impossibles à obtenir du point de vue de la langue (c'est-à-dire simples, puissantes et sûres).

Soit vous prenez le chemin sûr (comme scala) et vous vous retrouvez avec un langage vraiment complexe, soit vous prenez le chemin simple et obtenez quelque chose qui est soit limité (google go generics limité à la liste et aux cartes) ou dangereux (Dart generics qui sont toujours covariant).

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

38
Simon Bergot

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

Quels sont les avantages d'utiliser LISP et Haskell?

ZÉZAYER:

  1. Code homoiconique. Cela permet un code auto-modifiant structuré.
  2. Macros compatibles avec la syntaxe. Ils permettent la réécriture du code passe-partout.
  3. Pragmatisme. CL est conçu pour que les professionnels travaillent. La plupart des langages fonctionnels ne le sont pas, en règle générale.
  4. Souplesse. Il peut faire beaucoup de choses différentes, le tout à des vitesses raisonnables.
  5. Verrue. Le monde réel est en désordre. Le codage pragmatique finit par devoir utiliser ou inventer des constructions désordonnées. LISP commun a suffisamment de verrues qu'il peut faire avancer les choses.

La seule vraie raison de choisir contre CL est sans doute que les bibliothèques standard sont datées.

Je vais sortir sur un membre et dire que dans le cas général, la syntaxe ne devrait pas être un problème pour un travailleur logiciel professionnel.

De: Pourquoi LISP est-il utile?

Haskell:

Haskell est un langage de programmation informatique. En particulier, c'est un langage polymorphe statiquement typé, paresseux, purement fonctionnel, assez différent de la plupart des autres langages de programmation. Le langage est nommé pour Haskell Brooks Curry, dont le travail en logique mathématique sert de base 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 Fonctionnel vs impératif

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

Vont-ils faire de moi un meilleur programmeur?

Oui, bien sûr, connaître plus de langages et de paradigmes ne peut que faire de vous un meilleur programmeur, mais soyez clair:

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 aide certainement à être un meilleur programmeur, apprendre à résoudre des problèmes avec des approches différentes bénéficie également grandement à votre réflexion logique.

Être un bon programmeur n'est pas une question de langue, mais d'avoir la capacité de résoudre n'importe quel problème dans n'importe quelle langue. Et lorsque vous ne connaissez pas la langue, la capacité d'apprendre cette langue rapidement et de l'utiliser efficacement.

Je pense que plus votre réflexion 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 la maintenabilité. Faites attention aux petits détails. Réfléchissez avant de taper!. Découvrez les modèles de conception. Suivez les bonnes pratiques.

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

15
jsedano

Lorsque vous apprenez des langues qui sont en dehors du paradigme que vous utilisez habituellement, cela vous ouvrira l'esprit à des solutions alternatives dans votre quotidien et peut même vous aider à mieux comprendre certaines fonctionnalités dans la langue de votre choix. Le simple fait de connaître ces langues ne fera pas de vous un meilleur programmeur à moins que vous puissiez prendre les leçons que vous avez apprises de ces langues et les appliquer aux situations que vous voyez tous les jours.

Cela étant dit, cela ne se limite pas aux langues. Lorsque vous lisez sur diverses structures de données que vous n'avez pas vues ou utilisées auparavant, cela peut aider à élargir la portée de vos connaissances, de sorte que la prochaine fois que vous rencontrez un problème, vous avez une solution de plus.

11
Jetti