2016-11-12 6 views
1

Я начинаю, и я пытаюсь понять примитивную функцию foldl/foldr. Я прочитал documentation и попробовал кое-что. Однако, я просто не могу понять его поведение в этом случае:Понимание примитивного «foldl» в Racket

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

Я думаю, что результат должен быть таким же, как:

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

Я не могу проследить foldl, так как функция является примитивным. Я не вижу, как процедура достигает этого результата. Я использую Racket и Dr. Racket.

+0

Это сообщение также может быть полезно: http://stackoverflow.com/questions/39018163/expanded-form-of-fold-in-racket – rnso

ответ

3

Ваше понимание foldl имеет порядок аргументов назад (хотя это понятно, так как порядок аргументов fold/reduce имеет тенденцию vary somewhat arbitrarily between languages). Правильная эквивалентность заключается в следующем:

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

В небольшой стороне, foldlявляется встроенная в #lang racket/base, но это не примитивным в том смысле, что она реализуется в среде выполнения. Если вы используете DrRacket, вы можете щелкнуть правой кнопкой мыши по использованию foldl и выбрать «Open Defining File», чтобы открыть модуль, где он реализован, который в этом случае равен racket/private/list.