135 votes

Clojure : réduire par rapport à appliquer

Je comprends la différence conceptuelle entre et :

Cependant, lequel est plus idiomatique clojure ? Faut-il faire beaucoup de différence une façon ou d’une autre ? D’après mes tests de performance (limité), il semble `` est un peu plus rapide.

132voto

Michał Marczyk Points 54179

reduce et apply ne sont évidemment qu'un équivalent (en termes de résultat final de restitution) pour associatif fonctions qui ont besoin de voir tous leurs arguments dans la variable-arité de cas. Quand ils sont le résultat sage équivalent, je dirais que c' apply est toujours parfaitement idiomatique, tout en reduce est équivalent à -- et peut raser une fraction d'un clin d'oeil, dans beaucoup de cas. Ce qui suit est mon raisonnement pour croire cela.

+ est lui-même mis en œuvre en termes de reduce pour la variable arité de cas (plus de 2 arguments). En effet, elle me semble extrêmement sensible "par défaut" du chemin à parcourir pour toute variable-arité, fonction associative: reduce a le potentiel pour effectuer certaines optimisations pour accélérer les choses, peut-être par quelque chose comme internal-reduce, de 1,2 nouveauté récemment désactivé en master, mais j'espère être réintroduite dans les années à venir-dont il serait bête de se répliquer dans toutes les fonctions qui pourraient en bénéficier dans le vararg cas. Dans de tels cas, apply sera juste ajouter un peu de surcharge. (Veuillez noter qu'il n'est rien à être vraiment inquiet.)

D'autre part, une fonction complexe peut prendre avantage de certaines d'optimisation des possibilités qui ne sont pas suffisamment général pour être construit en reduce; ensuite, apply vous permet de profiter de ceux, tout en reduce pourraient effectivement ralentir votre système. Un bon exemple de ce dernier scénario se produisant dans la pratique est fourni par str: il utilise un StringBuilder en interne et en bénéficieront grandement de l'utilisation de apply plutôt que d' reduce.

Donc, je dirais utiliser apply en cas de doute; et s'il vous arrive de savoir que ce n'est pas vous acheter quelque chose de plus reduce (et que c'est pas susceptible de changer très bientôt), n'hésitez pas à utiliser reduce à raser qui diminutif de surcharge inutile si vous en avez envie.

57voto

David Rz Ayala Points 149

Pour les débutants en regardant cette réponse,
attention, ils ne sont pas les mêmes :

24voto

Greg Points 4537

Il ne fait pas une différence dans ce cas, parce que + est un cas particulier qui peut s’appliquer à n’importe quel nombre d’arguments. Réduire est un moyen d’appliquer une fonction qui attend un nombre d’arguments (2) fixe à une arbitrairement longue liste d’arguments.

22voto

drcode Points 1502

Opinions varient-In le monde Lisp, est certainement considéré comme plus idiomatique. Tout d’abord, il y a les problèmes de variadic déjà présentés. En outre, certains compilateurs Lisp commun réellement échoue lors s’exerce contre les très longues listes en raison de la manière de gérer listes d’arguments.

Parmi les Clojurists dans mon cercle, bien que, à l’aide de `` dans ce cas semble plus fréquente. Je trouve plus facile de grok et préfère également.

11voto

mikera Points 63056

Je me surprends normalement préférant réduire lorsqu’il agit sur tout type de collection - il se comporte bien et est une fonction très utile en général.

La raison principale que j’utiliserais s’appliquent si les paramètres des significations différentes dans différentes positions, ou si vous avez un couple de paramètres initiaux mais veulent obtenir le reste d’une collection, par exemple

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