我正在使用DrRacket作为方案编译器。当我尝试使用fold-right函数时,我得到了“fold-right:模块中的未绑定标识符:fold-right”。在调用此函数之前是否需要包含一些库?
谢谢!
答案 0 :(得分:7)
我认为您正在寻找foldr
。 foldr是fold-right的球拍实现。
来自文档:
与
map
类似,foldl
将一个过程应用于一个或多个元素 名单。而map
将返回值组合到列表中,foldl
以任意方式组合返回值 PROC。
[...]
[
foldr
]与foldl
类似,但列表从右到右遍历 剩下。与foldl
不同,foldr
处理空间中的lsts成比例 到lsts的长度(加上每次调用proc的空间)。
修改强>
您可能还想按照Chris的建议使用srfi / 1库,特别是如果您希望fold-right像srfi/1 recommendation一样工作。有一些微妙的差异:
#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))
输出:
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}
注意:fold-right
在不同大小的列表上没有错误,但您仍然只从第二个列表中获取1,2,3个原子。这符合srfi / 1规范:
当最短列表用完时,折叠操作终止 值
foldr
会出错。
答案 1 :(得分:1)
您应该在代码顶部添加(require (only-in srfi/1 fold-right))
。