我得到这个什么是lambda的要点?
(define (ident x) x)
相同
(define ident (lambda (x) x))
但是,为什么使用拉姆达时,你可以简单地使用以前在这里?这看起来不是更简单吗?
我得到这个什么是lambda的要点?
(define (ident x) x)
相同
(define ident (lambda (x) x))
但是,为什么使用拉姆达时,你可以简单地使用以前在这里?这看起来不是更简单吗?
是的,通常你会定义一个函数,并给它起名字时使用简写。
有时候定义一个函数可以立即使用,并且不需要名称。人们经常称这些“匿名功能”。当你不需要需要它有一个名字,很高兴不被强迫提供一个。
例如,假设您想要将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函数来表示,但即使在这种情况下,任何一个例子都可以工作。
那么,如果你的例子是只有使用lambda
,那么显然它是多余的。但也有lambda
的define
之外的许多其他应用,比如这个:
(map (lambda (x y)
(sqrt (+ (* x x) (* y y))))
'(3 6 9) '(4 8 12))
下面是使用相同的过程短表和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。
糟糕,您需要将函数作为'map'调用的第一个参数。 –
Gah。谢谢。 ;) –
所以基本上你不必在使用lambda时定义一个函数?或不?看起来很简单。 – Josh