我明白了
(define (ident x) x)
与
相同(define ident (lambda (x) x))
但是为什么在你可以简单地使用前者时使用lambda呢?它看起来不是更简单吗?
答案 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函数表示,尽管在这种情况下,任何一个例子都可以工作。