2009-09-17 7 views

Répondre

1

récursion. Difficile d'envelopper votre tête autour d'elle parfois

+5

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

+0

rire(); void laugh() {print ("ha"); rire(); } Bien que cela aboutirait à quelque chose ressemblant au nom de ce site par la suite; ^) – Toad

+0

Pas si votre langue prend en charge la récursivité de la queue.;) – mipadi

6

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.

+0

Est-ce utile? o_O –

+0

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 –

+2

Pas vraiment difficile, à mon avis ... Les monades sont sûrement d'un ordre de grandeur plus difficile ... – em70

8

envelopper ma tête autour de style passant de continuation a aidé mon javascript codage beaucoup

1

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).

6

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.

+0

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. –

3

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)

Fun with Phantom Types

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.

Questions connexes