理解 Racket 中的原语 "foldl"

Understanding the primitive "foldl" in Racket

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

你对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 和 select 的“打开定义文件”以打开实现它的模块,在本例中为 racket/private/list