Lisp “理解原初”;foldl";吵闹

Lisp “理解原初”;foldl";吵闹,lisp,racket,fold,Lisp,Racket,Fold,我是一个初学者,我试图理解原始函数foldl/foldr。我读了这本书,试了一些东西。 但是,在这种情况下,我无法理解它的行为: (foldl expt 2 '(1 2 3 4)) >> 262144 我认为结果应该是一样的: (expt (expt (expt (expt 2 1) 2) 3) 4) >> 16777216 我无法跟踪foldl,因为该函数是原语。我看不出这个程序是如何达到这个结果的。我正在使用Racket和Dr.Racket。你对foldl的理解是

我是一个初学者,我试图理解原始函数foldl/foldr。我读了这本书,试了一些东西。 但是,在这种情况下,我无法理解它的行为:

(foldl expt 2 '(1 2 3 4))
>> 262144
我认为结果应该是一样的:

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

我无法跟踪foldl,因为该函数是原语。我看不出这个程序是如何达到这个结果的。我正在使用Racket和Dr.Racket。

你对
foldl
的理解是参数顺序向后的(尽管这是可以理解的,因为fold/reduce的参数顺序倾向于向后)。正确的等效性如下所示:

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

顺便说一句,
foldl
内置于
#lang racket/base
,但它不是在运行时实现的原语。如果您正在使用DrRacket,您可以右键单击使用
foldl
,然后选择“打开定义文件”以打开实现该文件的模块,在这种情况下,该模块是
racket/private/list

此帖子也可能有帮助: