Programmation fonctionnelle : choix du langage

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Je souhaiterais me mettre à la programmation fonctionnelle en amateur mais je ne sais par quelle langage commencer, ni clairement quelle en sont les avantages.

J’ai trouvé haskell, ocaml et peut être erlang.

Je recherche des tutos compréhensible de préférence en français, avec une communauté, et des bibliothèques (framework web, si possible pip).

Que me conseillez vous sachant que je viens de python/Django ?

OCaml étant assez francophone comme langage tu devrais trouver des ressources en Francais. J’ai peur que Haskell soit très austère pour débuter et n’ait pas de ressources francophones.

Cependant, j’aurai plus tendance à conseiller des langages comme Scala, Clojure ou Kotlin. Ce sont des langages qui AMA sont plus sympathiques pour débuter et ont une meilleure dynamique apparente (communauté, ressources, framework, hype,…). A noter que Clojure ou Kotlin peuvent compiler vers du Javascript, ce qui en matière de dev web, est un avantage indéniable.

+0 -0

Hello,

Scala, Clojure ou Kotlin qui AMA sont plus sympathiques pour débuter et ont une meilleure dynamique apparente

Dans l’ordre pour le fonctionnel, peut-être plutôt Clojure, puis Scala, puis Kotlin.

Scala est vraiment bien, mais la double orientation objet / fonctionnel (que j’apprécie énormément à l’usage hein), risque d’être assez déroutante pour quelqu’un qui veut se mettre à la programmation fonctionnelle.

Top pour l’immutabilité, le map / reduce, l’application partielle de fonctions entre autres exemples, mais si on commence à parler d’objet vs. classes (companion objects), là j’ai un peu peur que ça porte à confusion. A moins que tu viennes vraiment de Java et que tu sois très familier avec la POO dans ce langage, auquel cas, Scala serait un bon choix oui.

Kotlin est très cool, a aussi une approche fonctionnelle dans une certaine mesure, mais ce qui fait son charme, selon moi, c’est plus la dose de sucre qu’il apporte à Java + les extension methods. Côté fonctionnel c’est un peu mieux que Java 8, certes, mais c’est pas "révolutionnaire" comme Clojure, ou "poussé" comme Scala.

Au rang des autres candidats, je citerais :

  • Elixir (j’ai du mal avec le typage dynamique, mais certains aimeront), y’a Phoenix qui est très inspiré de RoR côté framework web, ça permettra de jouer assez vite avec pour faire des petits backends web

  • Elm côté front. Ca compile en JS, c’est 100% fonctionnel, ça permet de mettre les mains dans l’approche "flux" prônée par Facebook et "son" implémentation redux, donc beaucoup de points communs avec d’autres technos non-fonctionnelles (JS en l’occurrence).

Pour quelqu’un qui veut faire du web fonctionnel aujourd’hui, ça me paraît être un très très bon couple. Par contre :

  • la marche va être assez haute (pour comprendre Elixir, faut en partie comprendre Erlang OTP, c’est très très instructif, mais c’est pas trivial, surtout si on n’a pas "vécu" les problèmes que OTP cherche à résoudre)

  • je ne sais pas trop ce qu’il en est des ressources en Français, mais j’ai peur que ce soit assez pauvre

Bon courage !

EDIT :

Je n’ai jamais accroché avec java, il me semble qu’ils sont un peu apparenté.

Ils ciblent la machine virtuelle Java, et sont inter-opérables avec Java. Après en ce qui concerne Scala par exemple, le rapport à Java s’arrête assez vite quand même.

A la question :

clairement quelle en sont les avantages.

Il faudrait connaître un peu mieux ton background en développement d’applications, et les langages que tu connais pour te donner des exemples / situations pertinentes.

Par exemple, pour un développeur Java, le livre Scala in action serait une bible à ce sujet, il regorge d’exemples traitant de ce que peut apporter l’immutabilité, de ce à quoi peut servir une "fonction partielle", des cas dans lesquels manipuler une fonction "as first class citizen" peut être intéressant, etc.

+1 -0

Comme le choix du "premier langage de programmation", le choix du "premier langage fonctionnel" n’est pas si fondamental que ça. Ce n’est pas parce que tu en prends un maintenant que tu n’iras pas voir ailleurs plus tard, et il y a plusieurs façons différentes de découvrir le sujet.

Ceci étant dit, comme pour le premier langage de programmation, certains langages s’y prêtent mieux que d’autres. Tu as entendu parler d’OCaml : c’est un très bon choix.

Haskell est également possible, mais la courbe d’apprentissage est plus rude, et c’est un langage qui demande d’avoir à peu près compris plusieurs concepts qui seront assez nouveaux pour toi avant de pouvoir comprendre un peu ce qu’on fait. Ce n’est en aucun cas impossible, mais ça peut paraître moins accueillant.

Erlang est un langage très amusant à découvrir, mais ce n’est probablement pas le meilleur choix pour découvrir le fonctionnel : l’intérêt du langage, c’est la programmation concurrente. Je ne suis pas sûr que ce soit une excellente idée d’attaquer les deux domaines de front avant d’avoir au moins une petite idée de comment l’un des deux marche.

Scala, pourquoi pas. Ça tourne sur la JVM, ce qui a des avantages qui ne te concernent pas pour l’apprentissage du fonctionnel, et des inconvénients qui vont t’embêter un peu, mais rien de dramatique (essentiellement le fait d’être "pollué" par les besoins de l’écosystème Java plutôt que d’avoir une base fonctionnelle vierge).

Clojure, à la rigueur. C’est un langage de la famille des Lisp, qui est un peu incontournable dans le paysage et l’historique des langages de programmation. Il tourne aussi sur la JVM. J’aurais plutôt envie de te conseiller un langage typé (parce que le typage statique fort et sûr va de paire avec l’utilisation des langages fonctionnels de nos jours, et que c’est quelque chose qu’on gagne vraiment à découvrir et à manipuler), mais si c’est ça qui te branche, tu peux essayer. Dans la même famille, il y a Common Lisp (qui vieillit un peu quand même) et Scheme (qui est parfaitement respectable) par exemple.

Par contre, je déconseillerais franchement Kotlin. C’est essentiellement un Java qui a décidé d’être moins stupidement verbeux, mais ce n’est vraiment pas le meilleur langage pour découvrir le style fonctionnel, qui est très peu mis en valeur et de façon assez étrange. Pour un langage de "tous les jours" pour quelqu’un qui veut faire du Java en moins moche (ou pour n’importe qui qui se sent bien avec – ce qui n’est pas mon cas, mais qui pourrait être le tien), pourquoi pas, mais pour découvrir un nouveau style de programmation, c’est un assez mauvais choix.


Tu parles de besoin de bibliothèques et d’un framework web : j’imagine que tu as très envie de pouvoir faire des choses avec ton nouveau langage, mais ça ne doit pas être ta priorité pour l’instant. L’important, c’est d’apprendre de nouvelles idées et un nouveau point de vue sur la programmation qui enrichira ta manière d’approcher des problèmes. Savoir comment on écrit un site web avec un langage précis, ça viendra plus tard. Quoiqu’il en soit, sache que tous les langages cités ont un framework web sérieux.

Par contre, la question de la communauté est plus importante, parce que tu auras des questions auxquelles tu voudras des réponses. OCaml a une communauté petite mais assez active, y compris francophone. Tu auras de l’aide facilement, y compris sur ZdS où on est plusieurs à programmer avec. Je ne connais pas trop les communautés des autres langages, mais je crois que celle de Haskell est assez active aussi (peut-être moins en français ?), et j’ai vu passer quelques messages ici, donc tu devrais pouvoir trouver de l’aide aussi. Scala et Clojure ont, je crois, des communautés assez grosses, mais je ne les ai jamais vraiment fréquentés. En tout cas, je n’ai pas de souvenir de discussions ici sur ces langages.

+4 -0

Merci pour vos réponses complètes et argumentés.

Je ne connaissais pas reason je vais regarder.

J’ai regardé erlang, cela me semble très intéressant mais c’est vrai que pour un début c’est peu être un peu trop.

Je vois que vous êtes tous plus ou moins portée sur ocaml et je pense que je vais me diriger vers ce langage.

Je prends des tutos si vous avez de bonne adresse.

J’aime développer pour le web plutôt coté serveur. J’ai de plus en plus de mal avec javascript et dart me semble compromis.

Ce qui me fait un peu peur c’est les bibliothèques tierces qui ont l’air moins nombreuses. C’est sans doute du au fait que je viens du python. Qu’en pensez vous ?

Me tapez pas dessus je fais que passer. JavaScript étant notamment un langage fonctionnel, c’est parfois une façon d’apprendre les concepts important de ce paradigme sans se taper l’apprentissage d’un nouveau langage en parallèle.

À ce propos j’ai beaucoup apprécié la lecture de ce petit bouquin : https://drboolean.gitbooks.io/mostly-adequate-guide/content/ch1.html

+3 -2

Je ne connaissais pas reason je vais regarder.

C’est une syntaxe alternative récente pour OCaml, où le but est d’imiter Javascript un maximum pour que ceux qui n’osent pas passer à OCaml à cause de la syntaxe (ce qui est par ailleurs profondément idiot) puissent faire le pas. Tu ne devrais pas t’embêter avec ça, ça ne t’apportera rien (ce serait même plutôt contre-productif, parce que la syntaxe de javascript est un peu moins adaptée pour exprimer les idées du fonctionnel).

Je prends des tutos si vous avez de bonne adresse.

J’aime développer pour le web plutôt coté serveur. J’ai de plus en plus de mal avec javascript et dart me semble compromis.

http://ocsigen.org, mais encore une fois, tu verras ça quand tu seras à l’aise avec le langage :-)

Ce qui me fait un peu peur c’est les bibliothèques tierces qui ont l’air moins nombreuses. C’est sans doute du au fait que je viens du python. Qu’en pensez vous ?

Moins nombreuses qu’en Python, probablement. Mais il existe quand même des bibliothèques pour faire plein de choses, et en pratique, à part quelques domaines un peu spécialisés (par exemple, on n’a pas encore de binding OpenCV pour la vision par ordinateur), tu as très peu de chances d’être limité par ça.

@victor : tu n’as vraiment honte de rien :D

+2 -0

@victor : tu n’as vraiment honte de rien :D

Eusèbe

Non non ! :)

Prends un développeur qui connait aucun "vrai" langage fonctionnel. Je te parie qu’il comprendra mieux ce qu’est un foncteur après cette lecture : https://drboolean.gitbooks.io/mostly-adequate-guide/content/ch8.html qu’après 4 chapitre de Learn You A Haskell.

Je pense sincèrement que c’est un bon moyen de comprendre ces concepts. Après je dis ni qu’il faut obligatoirement faire ça, ni qu’il faut s’arrêter là. Moi ça m’a fait bien comprendre des concepts qui m’avaient semblés très compliqués quand en parallèle j’avais affaire à la syntaxe d’haskell et l’intransigeance de ce langage.

Une partie de ça vient probablement du fait que pour le JS je connaissais le tooling. Je pouvais tracer mon code, l’inspecter, le debugger. Vraiment pas facile d’apprendre un nouveau paradigme plus un nouveau langage plus un nouvel écosystème / tooling tout en même temps ! ;)

+1 -1
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte