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