我明白了
(define (ident x) x)
是相同的
(define ident (lambda (x) x))
但是,当您可以在这里简单地使用前者时,为什么还要使用 lambda 呢?是不是看起来简单一些?
这是在同一过程中使用短格式和 lambda 的示例:
(define (make-generator from step-proc) ; short form
(lambda () ; the lambda here is the procedure returned
(let ((tmp from))
(set! from (step-proc from))
tmp)))
;; can't use short form here since make-generator
;; returns the procedure
(define natural
(make-generator 1
;; use an anonymous procedure
;; to increase the previous number by 1
(lambda (x) (+ 1 x))))
(natural) ; ==> 1
(natural) ; ==> 2
(natural) ; ==> 3
;; can't use short form here since make-generator
;; returns the procedure
(define rational
(make-generator 1
;; use an anonymous procedure
;; to halve the previous number
(lambda (x) (/ x 2))))
(rational) ; ==> 1
(rational) ; ==> 1/2
(rational) ; ==> 1/4
现在,Scheme 最初没有缩写形式(直到 1986 年的 R3RS,第一个规范之后的 11 年),但现在它已经出现了多次修订,只要人们理解它是一样的,就可以安全地使用它. 有些书的第一版早于 R3RS,有些还没有更新以使用它,因为它可能会混淆有多个定义过程的方法。其中一本书是优秀的Little Schemer。
好吧,如果您的示例是 a 的唯一用途lambda
,那么显然它是多余的。但是还有很多其他的lambda
outside of 的应用define
,比如这个:
(map (lambda (x y)
(sqrt (+ (* x x) (* y y))))
'(3 6 9) '(4 8 12))
是的,通常您在定义函数并为其命名时会使用简写。
有时定义一个可以立即使用的函数很方便,而且不需要名称。人们通常称这些为“匿名函数”。当您不需要它有一个名字时,最好不要被迫提供一个。
例如,假设您想为列表中的每个项目添加 2。您可以map
为此使用,为其提供一个增加 2 的函数。您可以编写:
(define (add-2 x)
(+ x 2))
(map add-2
(list 1 2 3))
但是,如果您只需要这些add-2
东西一次,那么您可以简单地编写以下代码:
(map (lambda (x) (+ x 2))
(list 1 2 3))
顺便说一句,您也可以将curry
其写为:
(map (curry + 2)
(list 1 2 3))
curry
是创建函数的函数。在像 Scheme 和 Racket 这样的语言中,使用这种“高阶函数”可以成为一种简洁表达事物和利用模式的方式。
在 Scheme 和 Racket 中,变量可以有一个数值,比如一个数字或一个字符串——它也可以是一个函数。函数是“一等”值,就像数字和字符串一样。你问的第一个表格清楚地说明了这一点:
(define x 1)
(define y "foo")
(define f (lambda (x) (+ x 2)) ;a function is a value like any other
学习并记住这一点是很好的,即使您通常会使用简写形式来定义命名函数。
可能(我想)你正在为一堂课这样做。可能他们希望您使用 lambda,以便您更熟悉 lambda 的工作原理。这两个函数都做同样的事情。前者更简单。但是,后者也很简单,有时简单的例子是说明性的。
此外,您稍后可能会使用该map
功能。这通常用 lambda 函数表示,尽管即使在这种情况下,任何一个示例都有效。