2013-10-27 49 views
1

我得到这个什么是lambda的要点?

(define (ident x) x) 

相同

(define ident (lambda (x) x)) 

但是,为什么使用拉姆达时,你可以简单地使用以前在这里?这看起来不是更简单吗?

回答

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 

这是很好的学习和记忆,即使你通常使用的简写形式定义一个名为功能。

+0

糟糕,您需要将函数作为'map'调用的第一个参数。 –

+0

Gah。谢谢。 ;) –

+1

所以基本上你不必在使用lambda时定义一个函数?或不?看起来很简单。 – Josh

1

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

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

2

那么,如果你的例子是只有使用lambda,那么显然它是多余的。但也有lambdadefine之外的许多其他应用,比如这个:

(map (lambda (x y) 
     (sqrt (+ (* x x) (* y y)))) 
    '(3 6 9) '(4 8 12)) 
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 

现在,计划没有原来有短形式(直到R3RS在1986年,第一规格11年后) ,但现在已经有好几次修订,只要理解它是一样的,就可以使用它。一些书籍的第一版本早于R3RS,并且有些书籍没有更新使用它,因为它可能会让人困惑,并且有多种方法来定义程序。其中一本书是优秀的Little Schemer