33 votes

Quelles sont les utilisations intéressantes des fonctions d'ordre supérieur?

Je suis en train de faire une Programmation Fonctionnelle cours et je suis assez amusé par la notion de fonctions d'ordre supérieur et les fonctions comme des citoyens à part entière. Cependant, je ne peux pas encore penser à de nombreuses pratiquement utile, sur le plan conceptuel incroyable, ou tout simplement intéressants fonctions d'ordre supérieur. (En plus de la typique et plutôt terne map, filter, etc fonctions).

Connaissez-vous des exemples de telles fonctions intéressantes?

Peut-être que les fonctions qui retournent des fonctions, des fonctions qui renvoient des listes de fonctions (?), etc.

J'apprécierais des exemples en Haskell, qui est la langue que je suis en train d'apprendre :)

45voto

Don Stewart Points 94361

Eh bien, vous remarquez que Haskell n'a pas de syntaxe pour les boucles? Pas de while ou do ou for. Parce que ce sont tous simplement des fonctions d'ordre supérieur:

 map :: (a -> b) -> [a] -> [b]

 foldr :: (a -> b -> b) -> b -> [a] -> b

 filter :: (a -> Bool) -> [a] -> [a]

 unfoldr :: (b -> Maybe (a, b)) -> b -> [a]

 iterate :: (a -> a) -> a -> [a]

Fonctions d'ordre supérieur remplacer la nécessité de boulangerie dans la syntaxe dans la langue des structures de contrôle, qui signifie à peu près chaque Haskell programme utilise ces fonctions, les rendant très utile!

Ils sont la première étape vers une bonne abstraction parce que nous pouvons maintenant, branchez le comportement personnalisé dans un objectif général de squelette de fonction.

En particulier, les monades ne sont possibles que parce que nous pouvons à la chaîne, et de manipuler des fonctions, afin de créer des programmes.

Le fait est, la vie est assez ennuyeux quand il est de premier ordre. La programmation ne devient intéressant que si vous avez d'ordre supérieur.

37voto

sigfpe Points 5200

De nombreuses techniques sont utilisées dans la programmation orientée-objet sont des solutions de contournement pour le manque de fonctions supérieures.

Cela comprend un certain nombre de modèles de conception qui sont omniprésents dans la programmation fonctionnelle. Par exemple, le modèle visiteur est plutôt compliqué à mettre en œuvre une fois. La solution de contournement consiste à créer une classe avec des méthodes et passez un élément de la classe comme un argument comme un substitut pour le passage d'une fonction.

La stratégie de modèle est un autre exemple de dispositif qui passe souvent à des objets comme arguments comme un substitut à ce qui est réellement prévu, les fonctions.

De même, l'injection de dépendance implique souvent certaines maladroit régime de passer un proxy pour les fonctions quand il sera souvent préférable de simplement passer dans le directement les fonctions comme arguments.

Donc, ma réponse serait que les fonctions d'ordre supérieur sont souvent utilisés pour effectuer les mêmes types de tâches que OO programmeurs effectuer, mais directement, et avec beaucoup moins passe-partout.

15voto

luqui Points 26009

J'ai vraiment commencé à sentir la puissance lorsque j'ai appris qu'une fonction peut être une partie d'une structure de données. Voici un consommateur "monade" (technobabble: gratuit monade sur (i ->)).

data Coro i a
    = Return a
    | Consume (i -> Coro i a)

Ainsi, un Coro pouvez instantanément donner une valeur, ou un autre Coro selon certains commentaires. Par exemple, c'est un Coro Int Int:

Consume $ \x -> Consume $ \y -> Consume $ \z -> Return (x+y+z)

Ce qui consomme de trois entier entrées et retourne leur somme. Vous avez aussi pu se comporter différemment selon les apports:

sumStream :: Coro Int Int
sumStream = Consume (go 0)
    where
    go accum 0 = Return accum
    go accum n = Consume (\x -> go (accum+x) (n-1))

Ce qui consomme de l'Int et consomme beaucoup plus que les services de renseignements avant de céder leur somme. Cela peut être considéré comme une fonction qui prend arbitrairement de nombreux arguments, construits sans aucune langue de la magie, juste des fonctions d'ordre supérieur.

Fonctions dans les structures de données sont un outil très puissant qui ne faisait pas partie de mon vocabulaire avant j'ai commencé à faire Haskell.

11voto

yatima2975 Points 4191

Consultez le document "Fonctions de même ordre supérieur pour l'analyse ou pourquoi quelqu'un voudrait-il utiliser une fonction du sixième ordre?" par Chris Okasaki. C'est écrit en ML, mais les idées s'appliquent également à Haskell.

9voto

Kurtosis Points 1053

Joel Spolsky a écrit un essai célèbre démontrant le fonctionnement de Map-Rédime en utilisant les fonctions supérieures de Javascript. Une lecture incontournable pour tous ceux qui posent cette question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X