Cette question est bien sûr inspirée par Monads dans Haskell.Quelle technique en programmation fonctionnelle est difficile à apprendre mais utile par la suite?
Quelle technique en programmation fonctionnelle est difficile à apprendre mais utile par la suite?
Répondre
récursion. Difficile d'envelopper votre tête autour d'elle parfois
En effet. Voir cette réponse ici: http://stackoverflow.com/questions/1438558/what-techniqie-in-functional-programming-is-difficult-to-learn-but-useful-afterwa/1438569#1438569 – skaffman
rire(); void laugh() {print ("ha"); rire(); } Bien que cela aboutirait à quelque chose ressemblant au nom de ce site par la suite; ^) – Toad
Pas si votre langue prend en charge la récursivité de la queue.;) – mipadi
Je dirais First-class functions.
En informatique, une programmation langue corroborerait fonctions de première classe (ou fonction littéraux) si elle traite les fonctions comme objets de première classe. Plus précisément, cela signifie que le langage supporte la construction de nouvelles fonctions au cours de la exécution d'un programme, en les stockant dans des structures de données, de les transmettre comme arguments à d'autres fonctions, et les retourner en tant que les valeurs des autres fonctions. Ce concept ne couvre pas tout moyen externe au langage et programme (métaprogrammation), tel que invoquant un compilateur ou une fonction eval pour créer une nouvelle fonction.
Est-ce utile? o_O –
pas seulement utile mais puissant. Par exemple, vous pouvez simuler la POO même si la langue ne le supporte pas. Voir par exemple: http://javascript.crockford.com/prototypal.html –
Pas vraiment difficile, à mon avis ... Les monades sont sûrement d'un ordre de grandeur plus difficile ... – em70
envelopper ma tête autour de style passant de continuation a aidé mon javascript codage beaucoup
Je dirais que Structural typing dans OCaml est particulièrement gratifiant.
Le concept de fonctions d'ordre supérieur, les fonctions lambda et la puissance des algorithmes génériques qui sont faciles à combiner ont été très bénéfiques pour moi. Je suis toujours excité quand je vois ce que je peux faire avec un pli en haskell. De même ma programmation en C# a beaucoup changé (pour le mieux, je l'espère) depuis que je suis entré dans la programmation fonctionnelle (haskell en particulier).
Voulez-vous mesurer l'utilité en relation avec la programmation fonctionnelle elle-même ou la programmation en général?
En général, l'expérience positive de la programmation fonctionnelle ne résulte pas de techniques particulières, mais de la façon dont il change votre façon de penser -
- contenant des données immuables
- déclarative Programmez des (récursion, pattern-matching)
- fonctions Traitement des données comme
Je dirais que la programmation fonctionnelle est la réponse à votre question elle-même.
Mais pour donner une réponse plus précise aussi, je voterais des mécanismes d'abstraction fonctionnelle comme
- monades
- arrows
- passage de continuation de style
- zippers
- -supérieur commandes-fonctions
- génériques + typeclasses.
Comme nous l'avons dit, ils sont très abstraites choses sur la première vue, mais une fois que vous les avez compris, ils sont extrêmement techniques fraîches et valueable pour écrire concis, de sécurité erreur et last but not least très code réutilisable.
Comparer les éléments suivants (pseudo-code):
// Concrete
def sumList(Data : List[Int]) = ...
// Generic
def sumGeneric[C : Collection[T], T : Num](Data : C) = ...
Ce dernier pourrait être un peu unintuitive par rapport à la première définition, mais il vous permet de travailler avec une collection et type numérique en général! Dans l'ensemble, de nombreux langages modernes (grand public) ont découvert de tels avantages et introduit des fonctionnalités très fonctionnelles comme lambda functios ou Linq. Ayant compris ces techniques permettra également d'améliorer l'écriture de code dans ces langues.
Je suis d'accord avec les cinq premières de vos suggestions, mais # 6 (génériques) n'est pas spécifique aux langages de programmation fonctionnels - même par ex. Java supporte les paramètres de type avec des limites et pourrait donc exprimer votre sumGeneric comme ci-dessus. –
Un du département "avancé": Programmation avec des types fantômes (parfois aussi appelés types indexés). Ce n'est certes pas une technique "standard" en programmation fonctionnelle mais pas entièrement ésotérique non plus, et c'est quelque chose pour occuper votre cerveau pendant un certain temps (vous avez demandé quelque chose de difficile, non?). En un mot, il s'agit de paramétrer les types à coder et d'appliquer statiquement certaines propriétés au moment de la compilation. L'un des exemples standard est la fonction d'addition vectorielle qui assure statiquement que deux vecteurs de longueur N et M donnent un vecteur de longueur N + M ou sinon vous obtenez une erreur de compilation. Oui, il y a des applications plus intéressantes. Ces techniques ne sont pas aussi utiles en C++ que dans un bon langage de programmation fonctionnel, mais jusqu'à présent, j'ai réussi à faire passer ces choses dans tous mes projets récents au travail à divers degrés, la plupart récemment dans un contexte C++ EDSL où ça a très bien marché. Vous n'avez pas forcément besoin d'encoder des choses fantaisistes, apprendre cela m'a aidé à saisir les situations où quelques balises de type peuvent réduire la verbosité d'un EDSL ou permettre une syntaxe plus propre, par exemple.
Certes, l'utilité est quelque peu limitée par le support de la langue et ce que vous essayez d'atteindre.
Quelques entrées:
Generic and Indexed Type (slides with some brief applications overview)
Le papier Kennedy et Russo mentionné dans les coulisses est Generalized Algebraic Data Types and Object Oriented Programming et met une partie de ce genre de choses dans le contexte de C#/Java.
Le chapitre 3 du livre de Dave Abraham C++ Template Metaprogramming est available online as sample chapter et utilise ces techniques en C++ pour l'analyse dimensionnelle.
Un projet FP pratique utilisant des types fantômes est HaskellDB.
- 1. Haskell - Aide à la programmation fonctionnelle
- 2. Nouveau en programmation fonctionnelle
- 3. Débutant à la programmation GPU: quoi apprendre?
- 4. Programmation fonctionnelle pour les algorithmes de base
- 5. Quelle technique de programmation non faite par vous, était en avance sur son temps?
- 6. Programmation de pixels suite
- 7. Quelle est la performance de F # par rapport à C#?
- 8. Quelle est la meilleure suite de composants Dotnet?
- 9. Bibliothèque de programmation fonctionnelle pour Objective-C
- 10. question sans importance sur erlang et la programmation fonctionnelle
- 11. Quelle est la (meilleure) source en ligne pour apprendre l'API de script OpenOffice.org
- 12. Qu'est-ce qu'un bon projet UTILE à coder pour apprendre la WCF?
- 13. Meilleure ressource pour apprendre la programmation d'application? (.Net/Cocoa/etc)
- 14. Quelle est la piste la plus rapide pour apprendre à créer des applications ASP.NET v3.5 d'entreprise?
- 15. Quelle est la meilleure ressource pour la programmation BlackBerry CLDC?
- 16. Quelle est la meilleure technique pour sortir d'un constructeur sur une condition d'erreur en C++
- 17. Quelle est la documentation * projet * la plus utile que vous avez rencontrée?
- 18. Quelle est la charge utile de demande recommandée/effective pour une méthode REST PUT?
- 19. efficacité du modèle de programmation fonctionnelle (spécifique Erlang)
- 20. Dans une programmation fonctionnelle, comment appelleriez-vous ce genre d'opération?
- 21. Quelle est la tendance de programmation dans les téléphones mobiles?
- 22. Méthodes d'effets secondaires dans purement langages de programmation fonctionnelle
- 23. Ordre SQL par problème-Suite
- 24. Apprendre OpenGL par Java
- 25. Quelle est la meilleure pratique/méthode de partage de contenu par programmation entre sites dans Joomla?
- 26. Comment apprendre la programmation et le modèle génériques C++?
- 27. Quelle bibliothèque Amazon S3 .NET est la plus utile et la plus efficace?
- 28. Quelle est la meilleure ressource pour apprendre le langage d'assemblage pour les microcontrôleurs PIC
- 29. Quelle est la meilleure façon de "maculer" une image par programmation?
- 30. API J2ME difficile à trouver
après un terme de monades en haskell, je ne comprends toujours pas. <> –