理解原语" foldl"在球拍中

时间:2016-11-12 21:25:30

标签: lisp racket fold

我是初学者,我正在尝试理解原始函数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。

1 个答案:

答案 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