Quel serait un bon premier projet de programmation fonctionnelle? [fermé]

19

Quel serait un bon premier projet de programmation fonctionnelle?

Je cherche à finir avec un coup sur mon projet de baccalauréat et je veux le terminer avec un projet de programmation fonctionnelle. Nous ne l'avons pas étudié à l'école mais nous sommes encouragés à essayer d'apprendre de nouvelles choses nous-mêmes, et j'ai pensé qu'apprendre un nouveau paradigme non seulement une nouvelle langue serait un excellent exercice pour moi, et probablement quelque chose d'intéressant pour les enseignants à voir aussi .

Le problème est que je veux commencer un peu à l'avance sur mon projet pour profiter des vacances d'été et mieux comprendre la programmation fonctionnelle et me familiariser avec une langue.

Que diriez-vous serait un projet de bonnes pratiques qui est un peu difficile, mais qui me permet également d'apprendre la langue, le paradigme, etc.

Des suggestions pour le meilleur langage pour commencer lors de la programmation fonctionnelle seraient également appréciées.

Meme
la source
1
"Quelle langue dois-je choisir" et les questions de sélection de projets sont ici hors sujet. Veuillez consulter la FAQ et cette méta-discussion pour plus de détails.
Adam Lear

Réponses:

10

C'est généralement plus facile si vous optez pour quelque chose de relativement mathématique ou logique - les langages de programmation fonctionnels sont généralement bien adaptés aux applications qui représentent une certaine forme de transformation d'une entrée donnée à une sortie.

Quelques idées, en gros ordre de difficulté:

  • Algorithmes génétiques - écrire un programme qui fait évoluer les solutions vers une tâche particulière où les solutions sont représentées dans une simple DSL. Je me suis amusé avant de construire de petits bots qui chassent pour se nourrir dans une grille 2D et font évoluer différents types de stratégies

  • Analyseurs de combinateurs - créez une bibliothèque de combinateurs d'analyseurs qui vous permet de construire un analyseur pour un langage arbitraire à l'aide de fonctions d'ordre supérieur.

  • Si vous voulez vraiment un défi, vous pouvez essayer d'écrire un jeu informatique ... sachez que c'est une tâche délicate car les jeux ont une énorme quantité d'état mutable qui peut être difficile à gérer dans un style de programmation fonctionnel. Attendez-vous à en savoir plus que vous ne l'avez jamais voulu sur les monades, etc.

Je recommanderais Clojure comme langage fonctionnel pragmatique. Je l'utilise depuis environ 18 mois maintenant et je suis extrêmement satisfait du choix. Les raisons principales sont:

  • Concurrence - Clojure a un système STM incroyable qui, à mon avis, en fait la meilleure langue au monde pour la simultanéité multicœur. Voir la vidéo sur: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey si vous voulez comprendre pourquoi c'est si spécial
  • C'est un Lisp - donc en raison de la philosophie du «code est des données», il est fantastique pour la métaprogrammation basée sur des macros (programmes qui écrivent des programmes, algorithmes génétiques, etc.)
  • Programmation fonctionnelle pragmatique - Le style Clojure est très fonctionnel (beaucoup d'accent sur les fonctions d'ordre supérieur, les séquences paresseuses, etc.) mais il n'est pas totalement pur comme Haskell. Il y a beaucoup de bons outils pour gérer l'état de la table et les effets latéraux
  • Dynamique - Clojure est un langage dynamique par défaut. Je trouve que c'est un gros coup de pouce pour la productivité. Cependant, vous pouvez éventuellement ajouter des indications de type statique ultérieurement si vous souhaitez bénéficier des avantages de la frappe statique en termes de performances.
  • Entièrement compilé - Le code Clojure est toujours respecté (même si vous faites un "eval") donc vous obtenez des performances assez décentes - certainement meilleures que la plupart des langages dynamiques que j'ai utilisés.
  • Vous avez accès gratuitement à toutes les bibliothèques et outils de l' écosystème JVM . Contrairement aux langages académiques qui ont des bibliothèques très limitées disponibles, vous pouvez accéder facilement à tout dans l'univers Java

Vous pouvez essayer les bases très facilement avec:

  • L' ensemble de problèmes en ligne 4Clojure - les premiers problèmes constituent une bonne introduction à l'apprentissage par la pratique du langage Clojure
  • le Clojure REPL en ligne sur http://www.try-clojure.org/
mikera
la source
J'ai choisi votre réponse à la question car elle a répondu à toutes mes questions. Merci beaucoup d'avoir pris le temps.
Meme
Haskell a aussi la STM; (
alternative
@mikera: Pour travailler avec la JVM, avez-vous essayé ABCL? Je l'ai essayé et n'en ai fait qu'un petit exemple, mais je n'ai presque aucune expérience avec. (J'ai également un livre Clojure dans ma liste de tâches, mais c'est une autre histoire, je suis curieux de savoir si vous avez une expérience de travail avec ABCL et Java).
Giorgio
@Giorgio: ABCL semble être une implémentation décente de Common Lisp sur la JVM. OTOH Clojure a les avantages d'être conçu pour la JVM, incorporant beaucoup plus d'innovations "modernes" et plus de dynamisme communautaire. Je pense que cela revient vraiment à savoir si vous vous souciez de maintenir la compatibilité ascendante Common Lisp ou non.
mikera
9

Avant de commencer à réfléchir à des projets spécifiques, commencez par apprendre les bases de la programmation fonctionnelle afin d'avoir une bonne idée des types de projets qui conviendraient le mieux.

Le meilleur endroit pour commencer est probablement la structure et l'interprétation des programmes informatiques (SICP), qui est basé sur le dialecte Scheme de Lisp. Il s'agit d'un texte CS classique, et le texte intégral est disponible en ligne (lien fourni).

Si vous voulez faire preuve de fantaisie et utiliser un langage fonctionnel plus moderne qui cible la JVM, jetez un œil à Clojure. Il existe même une version adaptée de SICP spécialement pour Clojure .

En parcourant le texte SICP, vous comprendrez pourquoi la programmation fonctionnelle est si bien adaptée à certains types de tâches, et les exercices peuvent inspirer un projet à part entière. Si vous choisissez de suivre la route Clojure et que vous souhaitez examiner certains projets existants, il existe de bons liens ici .

Jason Lewis
la source
Merci d'avoir fourni le lien pour le livre. Je vais lire cela pour mieux comprendre.
Meme
Avez-vous lu votre SICP aujourd'hui?
MattyD
3

Analyse quantitative

Si vous trouvez la finance quelque peu intéressante, faire des trucs quant avec la programmation fonctionnelle est un bon match car c'est très algorithmique. Je parle de la théorie du portefeuille et des choses comme les ratios sharpe et sortino, etc. Faites une application qui analyse les rendements d'un fonds et donne différentes statistiques, diagrammes, etc.

Je recommanderais F # uniquement parce que je pense que c'est un langage fonctionnel facile à démarrer, qu'il a de bons outils et un bon cadre pour le soutenir. D'autres alternatives sont lisp et clojure mais elles sont un peu plus difficiles à apprendre.

Homde
la source
À un niveau élevé, il est en effet vrai que vous pouvez faire beaucoup de choses de manière fonctionnelle. Les gens ont utilisé des langages fonctionnels pour décrire les gains d'options exotiques, par exemple. Mais au fur et à mesure que vous descendez au niveau du sol, comme le calcul de l'ACP, la résolution d'équations non linéaires, etc., les algorithmes deviennent de plus en plus itératifs et il vaut mieux les coder à l'ancienne.
quant_dev
1
Je ne dirais pas que, d'après mon expérience, l'analyse quantitative consiste à exécuter des algorithmes sur des séries. J'ai implémenté des trucs quant en C # et c'était très bien aligné avec LINQ, au moins pour le genre de trucs sur la théorie du portefeuille
Homde
Qu'en est-il des implémentations des algorithmes eux-mêmes?
quant_dev
Je ne vois aucun problème dans la plupart des cas, n'est-ce pas? Prenez le calcul d'un ratio de sharpe, vous calculez d'abord un rendement annualisé à partir d'une série de rendements, puis vous utilisez cette valeur avec un taux sans risque et la volatilité: (annualizedReturn - riskFreeRate) / volatilité. Rien qu'un langage fonctionnel ne pouvait gérer
Homde
Qu'en est-il de l'étalonnage du modèle de tarification?
quant_dev
3

Pour commencer, vous pouvez essayer d'implémenter un petit jeu de blackjack en F #. Il s'agit d'un projet de devoirs assigné lors de ce court tutoriel vidéo . La solution est également fournie sur le net (et dans l'une des vidéos).

knb
la source
2

Vous pouvez écrire un interpréteur de schéma ou de lisp avec OCaml.

davidk01
la source
A noter également un livre haskell à ce sujet sur le schéma d'écriture en haskell.
alternative
2

À quel langage fonctionnel pensiez-vous? Chacun a des caractéristiques différentes. La seule langue qui a eu le plus d'impact sur moi était Haskell et je vous suggère de faire de même.


la source
Je pensais à F # honnêtement principalement parce qu'au Danemark Microsoft tout est populaire, mais plus je lis des opinions différentes, je doute de cette décision. Je veux une langue qui m'aidera à apprendre le paradigme principalement, et après je suis sûr que ce n'est pas difficile d'en apprendre une autre si j'ai besoin ou envie.
Meme
Cela dépend fortement de l'endroit où vous vous trouvez et de ce que vous faites. Pour nous, les technologies de programmation Microsoft sont inutiles car elles ne prennent pas en charge notre plate-forme principale. Mais je m'égare: si vous voulez utiliser F #, c'est parfait, mais ouvrez une nouvelle question spécifique à F #.
Je ne veux pas utiliser ça. Je n'ai pas encore pris de décision. La question de la langue à utiliser était de toute façon secondaire.
Meme
Dans ce cas, trouvez un projet, puis demandez des recommandations pour le résoudre. Par exemple, Prolog est idéal pour la recherche d'arbre de décision. Haskell est idéal pour l'appariement de motifs. Lisp est idéal pour construire et manipuler des programmes Lisp au moment de l'exécution en fonction de vos données.
0

Vous pouvez également contribuer à un projet open source.

Par exemple, dans le projet de langage de programmation Frege , il y a beaucoup de travail à faire. Par exemple, vous pourriez vous soucier du portage des bibliothèques Haskell de base. Cela ferait de vous une sorte d'expert Haskell pendant que vous travaillez dessus.

Ingo
la source