球拍中的Lambda解释

 眾于-晴 发布于 2022-12-23 11:38

我试图理解在球拍中使用lambda,我仍然不清楚.我知道他们是无名(匿名)功能,但为什么这么好?我需要从其他函数访问我的函数,所以我怎么称呼它们?请解释下面的小程序,为什么使用lambda更好?谢谢.

; why is this better than below???
(define test
  (lambda (x)
    (lambda (y)
      (+ x y))))

(define add27
  (test 27))

; what's wrong with this???
(define (addTest x)
  (+ x 27))

> (add27 2)
29
> (addTest 2)
29

Óscar López.. 15

在Racket(和其他函数式编程语言)lambda中,当你想要将一个内联的一次性函数作为参数传递而不首先定义它时,s非常有用.例如,假设我们想要对数字列表进行平方.我们可以长途跋涉并square首先定义一个函数,然后使用map:

(define (square x)
  (* x x))

(map square '(1 2 3 4 5))
=> '(1 4 9 16 25)

......或者我们可以简单地传递一个lambda,像这样:

(map (lambda (x) (* x x))
     '(1 2 3 4 5))

=> '(1 4 9 16 25)

如您所见,存在我们不需要引用函数名称的情况.当然,如果由它表示的过程lambda将在几个部分中重用,或者如果它是递归的,那么为它命名是有意义的(因此它不再是匿名的):

(define square
  (lambda (x) (* x x)))

以上等同于square开头的第一个定义.实际上,第一个定义只是定义函数的语法糖,但最后所有函数都是lambdas!

现在让我们看看你的例子吧.在这里,我们使用一种lambda稍微不同的方式,并举例说明它们有用的原因 - 我们不仅定义了一个函数,还返回了一个函数:

(define test
  (lambda (x)
    (lambda (y)
      (+ x y))))

也许如果我们这样写它会更清楚一点(由于上面提到的原因它是等价的):

(define (test x)
  (lambda (y)
    (+ x y)))

甚至更短 - 在Racket中我们也可以将此语法用于相同的目的:

(define ((test x) y)
  (+ x y))

并不是说这是一种更好(或更糟)的定义功能的方式 - 这是另一回事!我们正在定义一个名为的过程test,它接收as参数x并返回一个新的匿名函数,该函数又将作为参数接收y.现在,在这些方面:

(define add27
  (test 27))

...我们调用testx值是27,返回匿名函数,我们命名该函数add27.还记得lambda收到的参数y吗?现在lambda已被命名add27- 这是一个currying的例子.想一想:它test是一个用于生成x向给定参数添加固定值的函数的函数y,这解释了为什么这会起作用:

(add27 2)
=> 29

另一方面,此函数将始终添加27到其参数,无法更改它:

(define (addTest x)
  (+ x 27))

(addTest 2)
=> 29

你看到了区别?test允许我们生成添加任意值的新函数,而addTest总是添加一个固定值27.如果你想添加说法100怎么办?使用test这很简单:

(define add100 (test 100))

但是addTest无法改变,我们需要编写一个新函数:

(define (addTest100 x)
  (+ x 100))

我希望这可以澄清一些事情,随时可以在评论中询问有关我答案的任何其他问题.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有