2016-11-12 2 views
1

Ich bin ein Anfänger und ich versuche, die primitive Funktion foldl/foldr zu verstehen. Ich lese die documentation und versuchte ein paar Dinge. aber ich kann einfach nicht begreifen, sein Verhalten in diesem Fall:Verständnis der primitiven "foldl" in Racket

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

ich glaube, das Ergebnis sollte das gleiche sein wie:

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

Ich kann nicht nachvollziehen foldl da die Funktion ein primitive ist. Ich sehe nicht, wie das Verfahren dieses Ergebnis erreicht. Ich benutze Racket und Dr. Racket.

+0

Dieser Beitrag kann auch hilfreich sein: http://stackoverflow.com/questions/39018163/expanded-form-of-fold-in-racket – rnso

Antwort

3

Ihr Verständnis von foldl hat die Argument Reihenfolge rückwärts (obwohl das verständlich ist, da die Argument Reihenfolge von falten/reduzieren tendenziell vary somewhat arbitrarily between languages). Die richtige Äquivalenz ist wie folgt:

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

Als kleines beiseite, foldlist eingebaut, um #lang racket/base, aber es ist nicht eine primitive in dem Sinne, dass es in der Laufzeit implementiert wird. Wenn Sie DrRacket verwenden, können Sie mit der rechten Maustaste auf eine Verwendung von foldl klicken und "Open Defining File" auswählen, um das Modul zu öffnen, in dem es implementiert ist. In diesem Fall ist dies racket/private/list.