2010-12-08 61 views

Répondre

0

Prendre la définition du pli droit et vérifier si Reverse().Aggregate(initval, func) s'adapte à celui-ci.

Définition:

En combinant le premier élément avec les résultats de la combinaison du reste est appelé un pli droit

Donc, si vous voulez calco la somme de (1, 2, 3). Si vous n'avez que Aggregate, l'évaluation sera (1 + 2) + 3. Si vous Reverse().Aggregate alors ce sera (3 + 2) + 1, ce qui correspond parfaitement à la définition.

La question pourrait être est-ce efficace parce que Reverse est opération coûteuse, mais fonctionnellement il est parfait pli droit.

+1

Le pli droit ne devrait-il pas être '1 + (2 + 3)'? –

+0

@Andrey: Pourriez-vous élaborer un peu plus sur l'efficacité? Comment est-il possible de mettre en œuvre le bon pli plus efficacement? J'y pensais beaucoup et je ne trouvais qu'une solution utilisant la récursivité (qui pouvait causer des débordements de pile sur de grandes séquences). –

+0

@tomp Si vous avez 'List' ou une autre structure de données qui permet la traversée d'arrière en avant, alors l'option la moins chère sera d'avoir juste une boucle de queue à tête. De toute façon je ne vois pas de points d'avoir le bon fold si vous avez un opérateur/fonction qui sont 1) purs 2) associatifs 3) commutatifs. 'a + (b + c) == (a + b) + c' donc à moins de quelques cas très exotiques je ne vois pas l'intérêt de faire le bon pli au lieu du pli gauche. – Andrey

0

Aggregate est un vrai pli gauche. L'agrégation d'une liste inversée a la même sémantique qu'un pli droit complet (non paresseux) sur une liste réversible.