Je suis tombé sur ce modèle dans dans le premier Aussi loin que je comprenne la fonction redx code>
composer code> fonction. Je ne comprends toujours pas comment dans l'exemple ci-dessous des fonctions sont évalués à partir du dernier et non de la première:
Réduire code> itération L'accumulateur est
f2 code> donc nous obtiendrons
f2 (f3 (2)) = 12 code>. Dans la prochaine itération, nous appellerons
f4 (12) = 48 code>. Dans la dernière itération, nous appellerons
F5 (48) = 240 code>. Donc, l'ordre d'évaluation est
F5 (F4 (F2 (F3 (2)))) Code>. Mais en utilisant
console.log code> Je vois que la commande d'évaluation est
F2 (F3 (F5 (2)))) code> qui est également 240 par coïncidence. P>
y code> est appelée tous les éléments de tableau, alors pourquoi seule la dernière fonction obtient
2 code> comme paramètre? P> P> P> P> P> P> P> P> >
3 Réponses :
La réduction ne convient pas aux fonctions F2, F3, F3, F5, mais elle crée une fonction de celles-ci. C'est la valeur de l'accumulateur dans chaque itération. Notez que la valeur est une fonction 1: A = F2; B = F3; Valeur de retour (NON TEMP mais fonction Y) = F2 (F3 (... args)) p>
2: A (Valeur de retour précédent) = F2 (F3 (... args)); B = F4; Valeur de retour = F2 (F3 (F4 (... args))) P>
et ainsi de suite .... p> code> et non un résultat de l'exécution de la fonction. P>
Passons à travers le code avec un exemple très simple: Aucune valeur initiale n'a été transmise pour réduire, il commencera par la première (F2) et la deuxième valeur (F3) de la matrice et appelez le rappel avec cela, Réduire continuera maintenant à la troisième élément, le premier argument étant le résultat du rappel précédent (le désormais désormais appelé x code> est appelé avec
A code> étant
F2 code> et
B code> étant
F3 code>. Maintenant,
x code> ne fait rien, il renvoie juste la fonction
y code> qui peut accéder à A et B via une fermeture. p>
Y code>), et le deuxième argument étant
F4 code>. Maintenant
x code> est appelé à nouveau, et une autre fermeture est créée sur
y code>,
y code> obtient le terme enfin de toute la fonction. P> Si nous essayons de visualiser une fonction ainsi fermée, ce sera le suivant: p>
y code> et transmettez-le. appellera
b code> (
f4 code>) et transmettez le résultat à l'appel à
A code> (mercurisé y). P>
a ( b ( ...args))
f2( f3( f4( 2 ) ) )
La fonction de composition peut être réécrite comme suit: après la première itération, la fonction renvoyée qui est transmise en tant qu'accumulateur suivant est le suivant: P> function composedFunction(arg) {
return f2(f3(f4(f5(arg))));
}
mauvaise implémentation de
composer code>. Plus important encore 1) Ce n'est pas une fonction totale. Utilisez
x => x code> (fonction d'identité) comme l'accumulateur initial, le deuxième argument à
Réduire code>, 2) Prise en charge de plusieurs arguments de la fonction la plus intérieure est stupide et coûteux - vous Besoin de supporter la composition de la fonction unaire, et 3)
TEMP code> est inutile, vous ignorez la variable et
renvoyer code> immédiatement. Ie
const comp = (f, g) => x => f (g (x)); const compose = (... FS) => fs.reduce (comp, x => x) code>