我是初学者,我正在尝试理解原始函数foldl / foldr。我读了documentation并试了一些东西。 但是,在这种情况下我无法理解它的行为:
(foldl expt 2 '(1 2 3 4))
>> 262144
我认为结果应该与:
相同(expt (expt (expt (expt 2 1) 2) 3) 4)
>> 16777216
我无法跟踪foldl,因为该函数是一个原语。我不知道该程序如何实现这一结果。我正在使用Racket和Dr. Racket。
答案 0 :(得分: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
的使用并选择“打开定义文件”以打开实现它的模块,在这种情况下为racket/private/list
。