foldr和Scheme中的apply有什么区别?

Boo*_*rat 1 lisp scheme racket

编程语言:Scheme / DrRacket

我发现foldr和之间的用法没有区别apply

谁能解释他们的不同之处?据我所知,使用文件夹可以实现与应用相同的功能。谢谢!

Bar*_*mar 6

它们是非常不同的,尽管在某些情况下它们可能是等效的。


(apply func '(1 2 3))
Run Code Online (Sandbox Code Playgroud)

相当于

(func 1 2 3)
Run Code Online (Sandbox Code Playgroud)
(foldr func 0 '(1 2 3))
Run Code Online (Sandbox Code Playgroud)

相当于

(func (func (func 3 0) 2) 1)
Run Code Online (Sandbox Code Playgroud)

如果函数是关联的和可交换的,并且允许您提供可变数量的参数,则结果将相同。例如

(apply + '(1 2 3)) == (foldr + 0 '(1 2 3))
Run Code Online (Sandbox Code Playgroud)

但是foldr可用于合并仅带有两个参数的函数的结果,或使用更灵活的方法来合并结果。

有关的更多信息foldr,请参见DrRacket / Scheme中的Map,Filter,Foldr。