2016-11-12 1 views
1

Je suis un débutant et j'essaie de comprendre la fonction primitive foldl/foldr. J'ai lu le documentation et j'ai essayé certaines choses. Cependant, je ne peux pas saisir son comportement dans ce cas:Comprendre le primitif "foldl" dans Racket

(foldl expt 2 '(1 2 3 4)) 
>> 262144 

Je pense que le résultat devrait être le même que:

(expt (expt (expt (expt 2 1) 2) 3) 4) 
>> 16777216 

Je ne peux pas trace foldl puisque la fonction est une primitive. Je ne vois pas comment la procédure atteint ce résultat. J'utilise Racket et Dr. Racket.

+0

Ce message peut également vous être utile: http://stackoverflow.com/questions/39018163/expanded-form-of-fold-in-racket – rnso

Répondre

3

Votre compréhension de foldl a l'ordre de l'argument en arrière (bien que cela soit compréhensible, puisque l'ordre des arguments de fold/reduce tend à vary somewhat arbitrarily between languages). L'équivalence correcte est la suivante:

> (foldl expt 2 '(1 2 3 4)) 
262144 
> (expt 4 (expt 3 (expt 2 (expt 1 2)))) 
262144 

En tant que petit côté, foldlest intégré à #lang racket/base, mais il est pas une primitive au sens où il est mis en œuvre dans le temps d'exécution. Si vous utilisez DrRacket, vous pouvez faire un clic droit sur une utilisation de foldl et sélectionner "Ouvrir le fichier de définition" pour ouvrir le module où il est implémenté, qui est racket/private/list dans ce cas.