什么是lambda?

时间:2013-10-27 19:06:56

标签: lambda scheme racket

我明白了

(define (ident x) x)

相同
(define ident (lambda (x) x))

但是为什么在你可以简单地使用前者时使用lambda呢?它看起来不是更简单吗?

4 个答案:

答案 0 :(得分:2)

好吧,如果您的示例是使用lambda,那么显然它是多余的。但lambda以外的define还有许多其他应用,例如:

(map (lambda (x y)
       (sqrt (+ (* x x) (* y y))))
     '(3 6 9) '(4 8 12))

答案 1 :(得分: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

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

答案 2 :(得分: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

答案 3 :(得分:1)

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

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