2

我使用 DrRacket 作为方案编译器。当我尝试使用 fold-right 功能时,我得到“fold-right:模块中的未绑定标识符:fold-right。” 在调用这个函数之前我需要包含一些库吗?

谢谢!

4

2 回答 2

7

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

从文档中:

Like mapfoldl将过程应用于一个或多个列表的元素。而map将返回值组合到一个列表中,foldl 则以由 proc 确定的任意方式组合返回值。

[…]

[ foldris ] like foldl,但列表是从右到左遍历的。与 不同foldlfoldr在与 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))

输出:

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会出错。

于 2012-09-21T12:40:36.787 回答
1

您应该添加(require (only-in srfi/1 fold-right))到代码的顶部。

于 2012-09-21T13:07:31.800 回答