在计划中折叠权利

时间:2012-09-21 12:00:57

标签: module scheme racket

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

谢谢!

2 个答案:

答案 0 :(得分:7)

我认为您正在寻找foldrfoldr是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))