1

我明白了

(define (ident x) x)

是相同的

(define ident (lambda (x) x))

但是,当您可以在这里简单地使用前者时,为什么还要使用 lambda 呢?是不是看起来简单一些?

4

4 回答 4

2

这是在同一过程中使用短格式和 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

于 2013-10-27T20:09:11.720 回答
2

好吧,如果您的示例是 a 的唯一用途lambda,那么显然它是多余的。但是还有很多其他的lambdaoutside of 的应用define,比如这个:

(map (lambda (x y)
       (sqrt (+ (* x x) (* y y))))
     '(3 6 9) '(4 8 12))
于 2013-10-27T19:28:22.360 回答
2

是的,通常您在定义函数并为其命名时会使用简写。

有时定义一个可以立即使用的函数很方便,而且不需要名称。人们通常称这些为“匿名函数”。当您不需要它有一个名字时,最好不要被迫提供一个。

例如,假设您想为列表中的每个项目添加 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

学习并记住这一点是很好的,即使您通常会使用简写形式来定义命名函数。

于 2013-10-27T19:30:13.303 回答
1

可能(我想)你正在为一堂课这样​​做。可能他们希望您使用 lambda,以便您更熟悉 lambda 的工作原理。这两个函数都做同样的事情。前者更简单。但是,后者也很简单,有时简单的例子是说明性的。

此外,您稍后可能会使用该map功能。这通常用 lambda 函数表示,尽管即使在这种情况下,任何一个示例都有效。

于 2013-10-27T19:28:00.140 回答