Introduire la programmation fonctionnelle dans votre environnement de développement [fermé]


15

C'est une longue histoire mais je vais essayer de la résumer du mieux que je peux. Nous sommes une boutique .NET qui écrit des logiciels pour différents types de fonds. Par exemple, nous écrivons des logiciels de gestion des demandes de règlement, des logiciels de gestion des pensions, des logiciels 401 (k) et d'autres choses de type financier.

Nous entrons maintenant dans un nouveau domaine: les travaux de type dérivé et analyse quantitative, ce qui semble très excitant. C'est quelque chose qui diminuera dans les 8 à 12 prochains mois, m'a-t-on dit.

Maintenant, j'ai appris une programmation fonctionnelle par moi-même, principalement des regards superficiels sur différentes langues via ce livre, mais je n'ai jamais vraiment creusé profondément. Maintenant, puisque nous sommes une boutique .NET, je pensais que F # pourrait être un bon choix, car nous pourrions potentiellement tirer parti de certaines bibliothèques .NET et des connaissances existantes.

Ma question est, par où commencer? J'ai beaucoup de mal à essayer de savoir si je devrais aller avec Haskell, Erlang, Scala, F #, etc.

Quelqu'un at-il eu une situation similaire? Dans l'affirmative, quelle a été votre expérience pour passer au fonctionnel et qu'avez-vous choisi et pourquoi? Je sais que c'est une sorte de grande question, mais je ne connais aucun développeur qui utilise des méthodes fonctionnelles en ce moment, je n'ai donc nulle part ailleurs où me tourner sans cesse sur Google et trouver des guerres enflammées partout sur le meilleur langage fonctionnel.


lecture recommandée: Par où commencer
moucher

Réponses:


14

Prototype, prototype, prototype! Prenez un peu de fonctionnalité d'entreprise qui, selon vous, nécessite une programmation fonctionnelle et essayez les différents langages pour voir s'ils vous offrent vraiment les avantages et l'interopérabilité que vous recherchez.


Bon conseil et je vais en tenir compte, en fait je fais une installation Erlang en ce moment pour l'essayer.
Nodey The Node Guy

10

La première question à laquelle vous devez vraiment répondre est pourquoi vous envisagez d'utiliser un langage fonctionnel. Si vous ne pouvez pas justifier une raison commerciale pour le changement, vous ne devriez pas le faire. En d'autres termes, vouloir introduire un nouveau cadre, un langage ou une autre nouvelle technologie dans votre environnement de travail simplement parce que vous voulez l'apprendre ou parce qu'il semble que la prochaine chose "cool" est définitivement une erreur. Vous devez donc d'abord vous demander honnêtement quelle est la motivation.

Si vous sentez vraiment que vous avez besoin d'un langage fonctionnel pour résoudre un problème particulier, et en supposant que la plupart des langages fonctionnels traditionnels répondront à vos besoins, alors j'irais avec le plus mature et celui avec la plus grande communauté d'utilisateurs. Erlang est un bon choix et répond à ces deux exigences, cependant, dans un environnement purement ms / .NET, je peux comprendre l'utilisation de F #.


2
@ennukiller - Je peux certainement voir que la programmation fonctionnelle serait un bon choix pour nous et je ne vais pas mentir - j'adorerais également l'utiliser uniquement pour la stimulation intellectuelle pure qu'elle offrira. Nous allons faire d'énormes quantités de calculs et je veux profiter du multicœur. De plus, il est impératif que chaque fonction mathématique soit prouvée correcte, je comprends que cela peut être plus facile avec la fonction.
Nodey The Node Guy

2
Si vous avez besoin de preuves, la programmation fonctionnelle pure est la meilleure. Certaines suggestions sont ici pour des add-ons fonctionnels aux langages impératifs - ils pourraient être plus familiers, mais ne vous donneront pas un code correct. En présence d'effets secondaires, vous ne pouvez pas utiliser le fait que x = x ('transparence référentielle'), et vous devez prouver que le x plus tard dans le code contient toujours la même valeur que précédemment. Dans certaines langues, par exemple, il peut arriver que le x:=3; y:=10; x:=add(x,x);résultat soit un xqui n'est pas 6 et un yqui n'est pas 10. Il n'est pas pratique de prouver que vos fonctions sont correctes dans ce contexte.
AndrewC

9

Je serais fortement d'accord avec F # pour une boutique avec une base de code .Net existante, tout comme je serais fortement d'accord avec Scala pour une boutique avec une base de code Java existante.

La programmation fonctionnelle est un outil comme les autres. Bien utilisé et intégré à la façon dont vous développez déjà le code, il peut vous rendre plus productif en facilitant la réflexion sur ce que fait votre code. Le changement de langue est cependant loin d'être gratuit, donc votre meilleur pari est une solution qui vous permet d'utiliser autant de votre code existant que possible aussi longtemps que possible dans la transition. Le moyen le plus sûr de ne pas introduire une nouvelle langue dans votre environnement, après tout, sera de dire à vos collègues qu'ils doivent réécrire tout ce qu'ils ont jusqu'à présent afin de voir les avantages d'un changement qui, à ce stade, vous essayez toujours de les vendre.


7

Je recommanderais de commencer la programmation fonctionnelle sans apprendre tout de suite un nouveau langage. Cela rend la tâche plus difficile si vous essayez d'apprendre un nouveau paradigme lorsque vous essayez également de vous familiariser avec la syntaxe d'un nouveau langage.

Bien sûr, les langages qui ont été spécifiquement développés pour faire de la programmation fonctionnelle auront certains avantages (comme avoir des constructions spécifiques telles que des compréhensions et rendre les structures de données immuables par défaut), mais en général, la plus grande étape à faire est de changer votre façon de penser en une fonctionnelle style. C # est idéal pour cela.

Fondamentalement, vous arrêtez simplement de changer l'état de votre code. J'ai fait cela en utilisant Java et c'est encore plus facile avec C # parce que vous avez des lambdas. Une fois que vous maîtrisez ce style et que vous savez à quoi il sert, il sera très facile de choisir un langage fonctionnel (que ce soit F # que vous choisissez ou Erlang) et d'être extrêmement productif avec.


1
+1: Je suis d'accord avec vous. J'ai également commencé à coder dans un style plus fonctionnel en Java et C ++ (en utilisant plus de variables finales et const, en cassant des opérations complexes en utilisant la composition des fonctions, etc.). Je pense que cela a définitivement amélioré mon style de programmation en Java et C ++. Après un certain temps, quand on se sent prêt à aller plus loin, on peut essayer un langage fonctionnel (Haskell, Ocaml, SML, Lisp, Scala, F #, etc.)
Giorgio

1

Si tout ce que vous voulez est d'apprendre et de comprendre la programmation fonctionnelle, installez simplement IronPython et concentrez-vous sur les fonctionnalités de Python. Au pire, vous apprendrez un outil qui peut être intégré à C # pour réduire le nombre de lignes de code dans une application et vous aider à fournir plus de produits sans bogue à l'avance.

Jetez un œil aux présentations de DaBeaz sur les générateurs pour un exemple de la façon dont les approches fonctionnelles en Python peuvent simplifier des choses complexes http://www.dabeaz.com/generators/

En dehors de cela, je pense que vous seriez sage d'investir du temps avec Scala. Il fonctionne sur .NET en mode bêta, vous pouvez donc l'installer et l'utiliser aujourd'hui à des fins d'apprentissage, et d'ici l'automne, il sera en mode de sortie pour .NET. Cela signifie que vous pouvez écrire dans Scala un code portable sur JVM et .NET. Et, puisque Scala est basé sur les acteurs et la transmission de messages, il est très, très facile de créer une application composée de plusieurs programmes distincts exécutés sur plusieurs machines distinctes. Lorsque vous ajoutez la portabilité .NET / JVM au mélange, il y a un autre aspect à considérer. Vous pouvez avoir une application qui exploite à la fois les bibliothèques Java tierces et les bibliothèques .NET tierces sans se soucier de développer des protocoles pour les faire communiquer. Les deux processus seraient écrits en Scala, et utiliserait la messagerie à distance Scala (acteurs distants) pour communiquer. Découvrez la bibliothèque Akka, qui semble finir par faire partie de la bibliothèque standard de Scala à en juger par ce que Typesafe.com fait.


+1: Pour mentionner Scala et sa disponibilité sur différentes plateformes. Question: akka remplacera-t-il l'implémentation actuelle des acteurs dans Scala? Ou les deux coexisteront-ils?
Giorgio

Je ne sais pas si Akka remplacera bientôt les acteurs actuels de Scala, mais le créateur de Scala, Martin Odersky, s'est joint au créateur d'Akka Jonas Boner dans la société Typesafe. Ils font la promotion de Scala avec Akka et maintenant avec le framework Play. Il est donc probable que le développement se concentrera sur Akka. Si vous apprenez simplement des acteurs avec Scala, il serait préférable de vous concentrer d'abord sur Akka.
Michael Dillon

Merci beaucoup pour l'information! J'ai regardé les acteurs de Scala, mais seulement très superficiels jusqu'à présent.
Giorgio le

-1

Je suis certainement d'accord avec l'essentiel de la réponse acceptée, et étant donné que vous plongez fondamentalement dans les choses en essayant Erlang, il semble que vous compreniez probablement assez bien comment vous apprenez et que vous aviez juste besoin d'un petit coup de pouce dans la bonne direction, donc clairement c'était une bonne réponse pour vous ... Mais, je pense que j'aborderais la question un peu différemment, car je vois que cette réponse ne m'aurait pas beaucoup aidé du tout; Je code toujours pour apprendre! Alors, voici mes pensées ...

(BTW, j'ai tendance à continuer en détail plus adapté, par exemple, aux chapitres d'un livre, et je suis sûr que je ne peux pas étouffer complètement mon instinct ici, mais je vais essayer une approche différente; je suis Je vais simplement résumer mes pensées ici, et au cas où quelqu'un voudrait plus de détails sur quelque chose, ou pense que quelque chose que je dis est trompeur dans ce format, je ferai de mon mieux pour me rappeler de passer par des rappels de réponse ...)

Pour essayer de me maintenir sur la tâche, voici ma compréhension des questions fondamentales posées dans le PO; Je garderai les lignes de côté au minimum nécessaire pour expliquer ...

D'abord les réponses rapides:

étais-je dans une situation similaire? C'était au moins similaire; J'étais en position de leader sur de nombreux projets variés mais néanmoins liés ... (CRM / Web / DB / Intégration de données / etc.)

comment / pourquoi ai-je fait le saut au fonctionnel? " J'ai vu quelques exemples LINQ et bien que j'aie définitivement rêvé d'une sorte de langage de requête intégré, typé statiquement [car j'avais principalement utilisé des langages typés statiquement (principalement C ++, et plus tard C # )] tout au long de ma carrière ... Mais, c'était un environnement de tir assez rapide dans lequel j'étais, et même si j'avais souvent réussi à voir ce qui se passait dans le passé, je n'avais jamais vraiment réfléchi, donc je n'ai jamais prévu qu'il pourrait / permettrait des opérations sur Plain Old Objects (lol!) tout aussi facilement; quand je l'ai vu, je savais que je devais l'avoir ... alors, c'est le pourquoi et le début du comment: je me suis concentré sur l'apprentissage de la compréhension de LINQ .

Quatre pensées ... euh, non, ce n'est pas juste ...

Quand j'ai lu la réponse de Martijn Verburg , la mention de la fonctionnalité métier me fait immédiatement penser à commencer à implémenter du code pour tout ce sur quoi je travaille ... En fonction de la profondeur de cette expérimentation initiale, je pourrais répondre différemment, mais en supposant que c'était juste en plongeant votre gros orteil, je ne suis pas sûr d'avoir eu quoi que ce soit directement pour le travail (ou un travail futur) qui m'aurait procuré l'excitation / passion que je pense que vous devriez probablement avoir pour les premiers problèmes que vous commencez à résoudre ...

J'étais presque entièrement basé sur des langages typés statiquement + des métaphores et des modèles OOP + tout ce que j'ai fini par enrouler mon cerveau accidentellement tout en résolvant mes problèmes réels au fil des ans ... Le fait étant que, si vous êtes comme moi, vous avez probablement beaucoup de cerveau dédié à des choses qui ne vous aideront pas beaucoup avec LINQ / FP.

Je pense que c'est un peu comme une programmation purement procédurale vs OO: il y a beaucoup de choses procédurales que vous finirez par utiliser dans OOP, mais ceux qui viennent en C ++ de C sans en faire une priorité pour grok / ken / "get" OO finissent par être très très mauvais en C ++. En fait, j'ai interviewé beaucoup de développeurs de pilotes de microprogrammes et de périphériques de longue date (15+) qui pensaient vraiment connaître le C ++, mais qui, tout au plus , avaient une compréhension terriblement basique / classique du C ++, avec pratiquement aucune compréhension de ou expérience en POO - parce qu'ils n'ont jamais fait de POO ... Ils ont écrit des classes polyvalentes singleton avec des membres statiques et des fonctions statiques avec une certaine quantité de classes non statiques / non singleton qui ont été utilisées comme structures.

Et FP a des concepts tout aussi hallucinants (pour ceux qui ne sont pas élevés sur le paradigme) et d'autres choses qui vont avec, et (bien que j'ai trouvé l'hybridation de nombreuses techniques idéale pour moi), je comprends de plus en plus et au fur et à mesure que le temps passe, à quel point ma réflexion était limitée avant d'intégrer de réelles capacités fonctionnelles dans mon ensemble d'outils; J'avais réussi à implémenter beaucoup de choses dans le passé d'une manière un peu plus créative que peut-être la plupart des programmeurs OO, mais comme j'utilise les concepts à quel point ma pensée était retardée avant ... Il y a des classes entières de problèmes qui peuvent être résolus en quelques lignes qui prenaient beaucoup de contorsion à faire en C ++ / C #.

tout à coup vous vous retrouvez ...

Dans un message "trop ​​long"

Vous êtes dans un labyrinthe de "ne lisez pas" sinueux, tous pareils.

Vous voyez une téléconférence dans un avenir proche, qui approche rapidement.
> laconique
Uhhuh. Sûr. D'accord, nous dirons que le mode "laconique" est "activé".

Vous voyez une téléconférence dans un avenir proche, qui approche rapidement.
> qu'est-ce que ça veut dire?
Je dis juste. N'as-tu pas dû faire quelque chose ce matin?

Vous voyez une téléconférence dans un avenir proche, qui approche rapidement. 
> hé, est-ce une grue derrière toi?
Quoi!? OÙ?! [s'enfuit en hurlant]

> Désolé, je n'ai pas compris QUOI OERE, reformuler?
[a continué à courir et à crier, le sarcasme inaperçu]

Alors ... Que dois-je apprendre, cher PSE, cher PSE?

J'ai personnellement commencé en C # avec LINQ. Cela m'a permis d'introduire quelques concepts à la fois, et pendant que je lisais constamment sur la PF et ses concepts, et plus de LINQ, et la relation entre les deux, cela m'a donné une voie à suivre tout en faisant un travail productif. J'ai ajouté quelques petites choses à la fois, les requêtes de données sont rapidement devenues un outil utile sans avoir à comprendre une tonne.

Maintenant, en y repensant, j'aimerais en quelque sorte avoir pu réaliser mon prochain projet (abordé environ un an plus tard); Je me suis moyennement familiarisé avec F # (qui, soit dit en passant, m'a donné une bonne longueur d'avance sur l'apprentissage du ML (métalangage) et de ses autres dérivés (par exemple, OCaml également).)

Fondamentalement, je pense qu'une réponse décente à `` ce qui '' dépend de trouver un bon appariement d'un problème de programmation qui vous intéresse, mais bien sûr, il doit être associé à un peu de FP que vous souhaitez apprendre ... (et vous pouvez rincer / répéter / faire mousser après avoir retiré quelque chose de la liste ...) Et, bien sûr, vous finissez toujours par en apprendre un peu plus que la chose principale que vous vous apprêtez à faire; au début, j'ai fait quelques pas, mais j'ai fini par faire de plus grandes choses et laisser les petites choses se mettre en place pendant que je les faisais.

D'abord, qu'est-ce qui fait flotter votre bateau? Surtout au début, il est préférable d'avoir quelque chose d'amusant et d'excitant (pour vous) et qui gardera suffisamment votre intérêt pour que cela en vaille la peine. Donc, les problèmes IOW sur lesquels travailler et les techniques qui résolvent ces problèmes ... LINQ et les requêtes de données en ligne pour moi au début. La récursivité était une autre pour moi, y compris la récursivité de la queue, j'en creuse le GodelEscherBach-ness; et j'avais lu sur la récursivité de la queue. À cette époque, les choses sur lesquelles je travaillais ont été suspendues, et j'ai fini par avoir un gros bloc de temps, donc j'ai pu y rester longtemps. C'était plus facile avec moins d'interruptions, mais parce que j'ai choisi des choses que je pensais amusantes, ce n'était pas si difficile, même avec l'interruption du travail. :)

Et même si je n'ai rien trouvé de cool dont je puisse vous parler, comme le programme de crabe conscient de soi, j'ai réussi à être assez bon dans ce domaine.

Et ... Avec quoi vais-je l'apprendre, cher PSE, cher PSE, avec quoi?

Pour cela, j'ai utilisé divers algorithmes qui m'intéressaient de toute façon, ainsi que diverses choses que je me demandais si vous pouviez faire en F #, et quand je manquais d'idées, je m'attaquais à des choses comme 99 bouteilles de bière et le Project Euler problèmes ...

Je suis sûr que vous pouvez trouver beaucoup de choses qui vous intéressent et qui concernent la PF; il offre tout, des améliorations à la POO, qui vous aident à énoncer les choses de manière un peu plus succincte jusqu'à tordre la façon dont vous auriez pensé auparavant dans une forme que vous ne reconnaissez pas et qui n'avait probablement même pas le modèle mental à exprimer avant.

Mais ... Il y a un trou dans mon modèle, cher PSE un trou ...

Et c'est pourquoi il est important que, surtout au début, mais vraiment tout au long de votre apprentissage (et n'est-ce pas toujours vrai lorsque vous apprenez quelque chose?), Vous prenez au moins un peu de temps entre les problèmes pour lire des choses sans rapport, mais encore FP et le temps de lire le code source écrit par des experts, de préférence résoudre les mêmes problèmes ou des problèmes similaires; ainsi que leurs explications sur les choses ...

Et pendant tout ce temps, vous devez forcer votre cerveau pour tout comprendre, pas de votre ancienne perspective mais de l'intérieur de FP lui-même ... À un moment donné pour moi, il a cliqué, et ... la chose que je peux le mieux relier to devient plus ou moins couramment le néerlandais; à un moment donné, j'ai réussi à me mettre assez dans l'état d'esprit (je l'ai fait par immersion, ce qui est essentiellement ce que j'ai décrit ici; vous immerger dans la PF plutôt que d'essayer de l'apprendre uniquement par le biais de "livre larnin '" ...)

Et, finalement, je l'ai fait; J'ai réussi à tout internaliser et à tordre mon cerveau jusqu'à ce que je commence à faire éclater FP / LINQ sans même que je doive faire un effort pour le traduire de nouveau en POO. (Oui, je l'ai fait; je devais avoir quelque chose pour accrocher ma jupe. Chapeau. Peu importe.)

Dernières pensées...

Mon, mon, il semble que vous perdiez votre capacité à penser à votre signature intelligente
titres des sections. C'est dommage.

La téléconférence approche à grands pas. Il semble beaucoup plus grand maintenant.
> oui, oui, eh bien .. laconique et tout. Je vois que vous avez réussi à perdre cette grue.
 fermer appel, que ... eh bien, oui, je suis ter ... OH NON, IL EST DE RETOUR!
AAAAAAAHHHHHH !! [s'enfuit en hurlant, encore une fois]

La téléconférence approche à grands pas.
Cela ressemble en quelque sorte à Sir Lancyjohn Cleezewiz.
C'est presque sur vous.
> hé, dépêchez-vous! J'ai une expérience à essayer avec toi! (et un po-ta-to)

Vous pouvez trouver une multitude d'informations en ligne sur la PF, naturellement. L'essentiel est de comprendre les concepts de base, puis d'apprendre à les appliquer. Par exemple, découvrez l'immuabilité et pourquoi elle est importante / utile pour la PF. Je recommande fortement d'apprendre un peu de théorie pour aller avec tout, comme la façon dont la PF pure peut être beaucoup plus adaptée à la preuve formelle. C'était une force motrice derrière l'ancêtre de F #, ML. YMMV bien sûr, vous pouvez être quelqu'un qui s'ennuie aux larmes, auquel cas, beaucoup d'exemples, beaucoup d'essais et d'erreurs pour voir exactement pourquoi les techniques utilisées sont ce qu'elles vous aideront à avoir ce 'Aha!' moment de l'ampoule.

Donc, je vais en rester là pour l'instant. J'espère que cela peut être utile à quelqu'un. Je voulais approfondir un peu les choses spécifiques à apprendre, mais je n'ai plus de temps pour le moment. J'espère que je trouverai un peu de temps pour y revenir bientôt, même si cela semble être une longue semaine pour moi, donc ce sera probablement au moins le week-end.

<3 "Présentation de GRUEBOL, un point d'arrêt; juste jusqu'à la fin de SnozzML. Ce devrait être bientôt; j'ai un énorme comité qui m'aide cette fois." --Grace Hopperwit Egghead, Famous Last Words , XX97 GUE <3


qu'est-ce que "cher SO"?
gnat

était cher débordement de pile; censé correspondre à la cadence de la chanson `` Il y a un trou dans le seau '' xD
shelleybutterfly

lorsqu'il est affiché en dehors de SO, cela semble rendre vos points plus difficiles à comprendre - pensez à les modifier pour en tenir compte
gnat

derp! oui en effet, l'ont fait. tyvm. :)
shelleybutterfly

si quelqu'un a des suggestions pour améliorer ma réponse, je l'apprécierais .. était-ce de la mauvaise humeur? ou mauvais conseil? il est en fait basé sur mon expérience, donc je suis heureux de le modifier si je peux le rendre plus utile. merci;)
shelleybutterfly
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.