我使用 DrRacket 作为方案编译器。当我尝试使用 fold-right 功能时,我得到“fold-right:模块中的未绑定标识符:fold-right。” 在调用这个函数之前我需要包含一些库吗?
谢谢!
我想你正在寻找foldr
. foldr是 fold-right 的球拍实现。
从文档中:
Like
map
,foldl
将过程应用于一个或多个列表的元素。而map
将返回值组合到一个列表中,foldl
则以由 proc 确定的任意方式组合返回值。
[…]
[
foldr
is ] likefoldl
,但列表是从右到左遍历的。与 不同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))
输出:
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
会出错。
您应该添加(require (only-in srfi/1 fold-right))
到代码的顶部。