在计划中折叠权利

Les*_*e G 2 scheme module racket

我正在使用DrRacket作为方案编译器.当我尝试使用fold-right函数时,我得到了"fold-right:模块中的未绑定标识符:fold-right".在调用此函数之前是否需要包含一些库?

谢谢!

mwo*_*ech 7

我想你在找foldr. foldr是fold-right的球拍实现.

从文档:

例如map,foldl将过程应用于一个或多个列表的元素.然而,map将返回值组合到列表中,foldl 将由proc确定的任意方式组合返回值.

[...]

[ foldr是]喜欢foldl,但列表是从右到左遍历的.不同的是foldl,foldr处理空间中的lsts 与lsts的长度成比例(加上每次调用proc的空间).

编辑:

您可能还想使用Chris建议的srfi/1库,特别是如果您希望fold-right像srfi/1推荐一样工作.有一些微妙的差异:

#lang racket
(require srfi/1)
(foldr list* '() '(a b c) '(1 2 3))
(fold-right list* '() '(a b c) '(1 2 3 4))
(foldr list* '() '(a b c) '(1 2 3 4))
Run Code Online (Sandbox Code Playgroud)

输出:

Welcome to DrRacket, version 5.3 [3m].
Language: racket; memory limit: 128 MB.
'{a 1 b 2 c 3}
'{a 1 b 2 c 3}
[ERROR] foldr: given list does not have the same size as the first list: '{1 2 3 4}
Run Code Online (Sandbox Code Playgroud)

注意:fold-right不同大小列表上没有错误,但您仍然只能从第二个列表中获取1,2,3个原子.这符合srfi/1规范:

当最短列表用完值时,折叠操作终止

foldr 做错了.