J'étudie Haskell dans le but de comprendre la programmation fonctionnelle, dans l'espoir d'appliquer les connaissances que j'ai acquises dans d'autres langues (Groovy, Python, JavaScript principalement.)
J'ai choisi Haskell parce que j'avais l'impression qu'il est très purement fonctionnel et ne permet pas de dépendre de l'État.
Je n'ai pas choisi d'apprendre Haskell parce que je m'intéressais à naviguer dans un système de type extrêmement rigide.
Ma question est la suivante: un système de types fort est-il un sous-produit nécessaire d’un langage fonctionnel extrêmement pur, ou s’agit-il d’un choix de conception sans rapport avec Haskell?
Réponses:
Je crois que comprendre le système de types de Haskell est un amplificateur pour comprendre la programmation fonctionnelle.
Le problème de la programmation purement fonctionnelle est qu’en l’absence d’effets secondaires, qui vous permettent de faire toutes sortes de choses implicitement, une programmation purement fonctionnelle rend la structure de vos programmes beaucoup plus explicite.
Haskell vous empêche de mettre des choses sous le tapis, vous oblige à traiter explicitement la structure de votre programme et vous apprend un langage pour décrire ces structures: le langage des types. Comprendre les types, particulièrement riches comme Haskell, fera de vous un meilleur programmeur dans toutes les langues.
Si Haskell n’était pas fortement typé, des concepts tels que les monades, les foncteurs applicatifs, etc. n'auraient jamais été appliqués à la programmation.
la source
Le langage fonctionnel le plus dynamiquement typé est sans doute Scheme. Cela dit, le système de types de Haskell est un indicateur de sa pureté. C'est une question de "comment mesurer la pureté?". Le système de types de Haskell vous permet de boucler facilement les actions impures dans
IO
. Pour ce faire, vous avez besoin d’un système de types statique.Mais disons que le système de types de Haskell n'a rien à voir avec la programmation fonctionnelle. Il serait tout à fait à la hauteur de l'hybris de prétendre que le système de typage ne vous aiderait pas dans cette entreprise éducative. Le système de types de Haskell est riche et complexe, et d'autant plus intéressant qu'il est comparé aux systèmes de types de C ++ et OCaml.
Est-ce un obstacle? Non, je pense que c'est un atout. Essayez de réfléchir à la façon de gérer la paresse de Haskell sans,
IO
par exemple.la source
Clojure est typé de manière dynamique et presque aussi pur que Haskell. Il est donc bon de dire que le système de types de Haskell était davantage un choix de conception qu'un impératif absolu. Les deux ont définitivement leurs points forts, donc vous pouvez envisager Clojure si vous n'aimez vraiment pas la rigidité de Haskell (mais voir ci-dessous).
Lorsque j'ai commencé à utiliser Haskell, je considérais que le système de types était gênant et je ne le tolérais qu'en raison de l'inférence de type. J'ai vite découvert que le compilateur se plaignait de nombreuses erreurs de type, même si le compilateur m'avait laissé le faire (par exemple, en utilisant accidentellement map au lieu de concatMap). J'ai ensuite découvert que les programmes qui passaient la vérification de type étaient généralement corrects, ou du moins proches de la correction. J'ai même eu une phase paresseuse où j'ai refactorisé en changeant un type de fonction et en laissant le compilateur me dire ce qu'il fallait changer. Finalement, j'ai réalisé que le système de types de Haskell était en fait très expressif et j'ai commencé à concevoir mes programmes autour des types. C'est le Saint Graal de Haskell.
la source
if
s etcond
s dans Scheme, qui, je suppose, est également transmis à Clojure.Le système de types de Haskell est essentiel pour sa capacité à isoler les effets du code pur. À moins que vous ne puissiez isoler les effets d’une autre manière ou que vous ne supprimiez aucun effet, un système de type statique fort est indispensable à la programmation purement fonctionnelle.
Haskell est un très bon exemple de langage doté d'un système de type statique fort. Si vous souhaitez une formation large et complète en informatique et en conception de langage de programmation en particulier, Haskell serait un excellent choix parmi les langues que vous devriez apprendre.
Le système de types ne devrait pas être un obstacle énorme. Les personnes qui programment ont tendance, même lorsqu'elles utilisent des langages dynamiques, à suivre les conventions de frappe pouvant être encodées à l'aide du système de frappe de Haskell. Haskell propose également une inférence de type qui atténue la verbosité par rapport à des langages tels que C ++ et Java. Lorsque vous recevez un message d'erreur, le compilateur vous dit seulement au moment de la compilation ce qu'un langage avec des types dynamiques vous dirait au moment de l'exécution.
L'opposé d'un système de type dynamique est un système de type statique et non un système de type fort. Un système de type fort est l'opposé d'un système de type faible.
la source
Il vous dit tout de suite lorsque vous faites des erreurs stupides. C'est utile. J'ai travaillé dans Racket (Scheme) ce dernier trimestre et, à plusieurs reprises, j'ai réussi un s-exp non analysé dans lequel je m'attendais à une fonction analysée de mon interprète. suite de test de taille moyenne. Si j'avais du typage statique, cela aurait immédiatement été porté à mon attention.
Bien sûr, les erreurs de logique ne peuvent pas vraiment être capturées par le système de types, mais le nombre de façons de gâcher vous-même est considérablement réduit.
De plus, l'inférence de type vous permet d'ignorer le système de types si vous le souhaitez. Il est toujours là, mais cela ne nécessite pas une participation active de votre part. Il est toujours utile de comprendre les types de vos fonctions, mais un code correct fonctionnera correctement.
La pureté de Haskell est codée dans son système de types. La monade IO est une construction de niveau type qui empêche le code impur de s'infiltrer dans des fonctions pures. La pureté est donc garantie par le système de types.
la source
Être un langage "fonctionnel" signifie (en dehors d’autres choses) que les fonctions sont des objets de première classe dans le langage.
Être un langage "pur" signifie que les fonctions sont des fonctions mathématiques (par opposition aux procédures) - si elles ont la même entrée, elles produisent toujours la même sortie.
Un "langage purement fonctionnel" est un langage dans lequel les deux éléments ci-dessus sont valables. Je ne suis pas au courant d'une « Pure - ly langue fonctionnelle ».
Un système de type fort est une propre façon d'avoir une langue pure et pratique. Les types aident le compilateur à comprendre les optimisations, en plus d’assurer la correction. (Mais ce n’est pas le seul moyen - clojure est pur, mais n’a pas un système de type aussi fort que Haskell.)
Si le système de caractères vous dérange, je vous suggère d'essayer un langage plus dynamique, tel que Scheme, ou d'utiliser le système d'inférence de types de Haskell.
la source
Oui, le système de types est un atout incroyable. Il serait très difficile de décrire même le fonctionnement des monades ou le fonctionnement de certains combinateurs sans le système de type. Considérez combien de tutoriels sur Haskell vous demandent d’abord de considérer le type de la fonction en question avec a: t au niveau de la réplique. Ce n'est tout simplement pas disponible pour vous dans un langage typé dynamiquement. Bien sûr, toute la complexité du système de types est toujours là. Une monade est toujours une monade. Mais la langue a décidé de se laver les mains et de ne fournir aucune aide. Vous êtes seul, mon pote. Je ne frappe pas des langues à typage dynamique. Je les aime beaucoup. Scheme est un outil puissant par excellence. Mais vous remarquerez que lorsque nous parlons de choses comme des monades dans des langages dynamiques, nous inventons souvent une notationpour décrire le type de procédures. Un programmeur fonctionnel se battra avec les types d'une manière ou d'une autre. Le vérificateur de caractères de Haskell vous donne simplement de bons outils pour apprendre à le faire.
la source