我正在学习如何在方案中使用高阶函数。我得到了使用高阶函数的想法,但是我在使用它们时遇到了麻烦。对于这个学习练习,我宁愿只使用过滤器、折叠和/或映射的某种组合。
例如,我想构造两个列表之间的集合差异,分别称为 A 和 B。我将集合差异定义为 x,这样 x 是 A 的元素,但 x 不是 B 的元素。我只想使用函数映射、过滤和折叠。例如:
令 A = (1 8 6 2)
令 B = (5 7 9 1 6)
A 和 B 的集合差为 (8 2)
这个想法是通过遍历 A 的元素并查看 A 的元素是否等于 B 的元素来构造一个新列表,如果是,则不要将 a 添加到新列表中;否则将 a 添加到新列表中。
我的算法思路是这样的:
让 neq 为“不等于”
对于 A 中的每个 a 和 B 中的 b 计算表达式:
(neq? a b)
对于 a = 1,我们有:
(和 (neq?1 5) (neq?1 7) (neq?1 9) (neq?1 1) (neq?1 6))
如果此表达式为真,则 a 进入新列表;否则不要将 a 添加到新列表中。在我们的示例
(neq? 1 1)
中,计算结果为 false,因此我们不会将 1 添加到新列表中。
我的整个过程几乎都依赖于 1,这就是我遇到麻烦的地方。
- 我该如何做第 1 步?
- 我看到在第 1 步中我需要一些
map
和fold
函数的组合,但是如何获得and a neq b
分布式?
编辑这是我拥有的最接近的样本:
(fold-right (trace-lambda buggy (a b c) (and (neq? a b))) #t A B)
|(buggy 3 5 #t)
|#t
|(buggy 2 4 #t)
|#t
|(buggy 1 1 #t)
|#f
#f
上面显示了我的匿名函数试图执行 (and (neq?ab)) 链的痕迹。但是,它只对 A 和 B 中相同位置/索引的元素执行此操作。
非常感谢所有帮助!