关于球拍:如何在方案中使用文件夹和Lambda?

 2021-04-26 

how to use foldr and lambda in scheme?

我开始学习lambda。有没有一种方法可以将foldrfoldllambda一起使用?有人可以给我一个简单的例子吗?谢谢


要添加3和4的平方,例如:

1
2
3
4
(foldl
  (lambda (val res) (+ (sqr val) res))
  0
  '(3 4))

初始值为0。对于列表\\'(3 4)的每个值,将调用函数并将其值绑定到val,并将上一个结果绑定到res

这等效于

1
2
3
4
(define (fun val res)
  (+ (sqr val) res))

(foldl fun 0 '(3 4))

除了在第一个示例中,该函数是匿名的。


您基本上可以将lambda与很多东西结合使用,包括foldl和foldr,过滤器,地图等(当然取决于您要实现的目标)。在此示例中,我们将使用文件夹。

假设我们要计算此列表中所有数字的总和:

1
(define list1 '(1 2 3))

使用foldr和lambda的语法为:

1
(foldr (lambda (x y) (+ x y)) 0 list1)

其中:

  • (lambda(x y)(x y))是我们的函数
    (采用两个参数x和y并将它们相加)
  • 0是基数(意味着我们从零开始,然后加上x和y)
  • list1是我们正在处理的列表的名称

基本上我们所做的是数学上的(1(2(3 0)))

最后但并非最不重要的是,包括lambda在内的整个文件夹功能都可以缩短为

1
(foldr + 0 list1)

它几乎会做同样的事情。

这里是另一个示例,请尝试自己弄清楚如何测试您对该概念的理解。

1
(foldr (lambda (x y) (append (list (add1 x)) y)) '() list1)