我学习方案。我知道如何使用这两种拉姆达,让表达式。
不过我在努力搞清楚的一点是使用lambda的东西。你能不能做让您可以与拉姆达的一切吗?
这将是特别有帮助,看的情况下一个lambda表达式是不是让一个更好的选择的例子。
还有一两件事 - 在那里也设在那里比拉姆达更有用的情况?如果是这样的一个例子将是很好的为好。
编辑:我也有兴趣在对比定义和λ,因为他们似乎来执行类似的任务。
感谢大家的帮助。我做了多一些寻找到的λ/让/阅读你的答案后确定,现在明白了很多。
我来到翻过酷拉姆达使用率的一个很好的例子 - 从过程返回匿名函数。例如,该过程operateTwice
下面返回是基于对程序传递的参数的匿名函数:
(define operateTwice
(lambda (op1 op2)
(lambda (x y)
(op2 (op1 x y) y))))
((operateTwice * +) 2 3) ;equivalent to: (+ (* 2 3) 3), or in standard notation 2*3+3
输出:
9
一个let
是lambda
。
EG
(let ((x 1))
body)
可以翻译成
((lambda (x) body) 1)
此外,在方案所有的控制和环境结构可以通过lambda表达式和lambda表达式的应用来表示。
所以,lambda
严格大于let
更强大,并形成许多方案中发现有趣的结构的基础。
关于define
和lambda
,顶级define
增加了一个结合了顶级的环境。
当你写
(define (f x)
body)
你的意思是说
(define f (lambda (x) body))
嵌套定义被翻译成letrec
,其可以使用的lambda以及被重写。
所以,再次,很多方案的构建可以被转换成使用lambda
的东西,因此,它是真正的欢颜,你明白lambda
好。
您可以使用lambda
如果你想创建一个函数来使用它作为参数传递给另一个函数(例如像map
),但你实际上并没有想命名的功能。
例如,如果要添加42列表中的每一个数字,你可以这样做:
(define (add42 x) (+ x 42))
(map add42 (list 1 2 3 4))
但是,如果你不想给一个名字,你只有一次使用这个功能,你可以只是做:
(map (lambda (x) (+ x 42)) (list 1 2 3 4))
我们实际上只是缩写lambda表达式。下面的两个表达式是等效的:
(let ((alpha 7)) (* 5 alpha))
((lambda (alpha) (* 5 alpha)) 7)
LAMBDA遵循语言的理念,一切都应该像数学函数。但在实践中让我们可以更容易地找出是否有太多的变量发生了什么。想象一下,10个变量具有拉姆达块后,他们的价值定义,你们是不是要相互匹配那些变量名的,与我们的变量值放在旁边他们的名字,方便了程序员,但符合较少的功能规划理念。
LAMBDA可以用来从一个高阶函数返回一个函数但是我们不能这样做。例如:
(define (plus-list x)
(cond ((number? x)
(lambda (y) (+ (sum-n x) y)))
((list? x)
(lambda (y) (+ (sum-list x) y)))
(else (lambda (x) x))
))
> ((plus-list 3) 4)
10
> ((plus-list '(1 3 5)) 5)
14
> ((plus-list 'a) 5)
5
拉姆达也可以用于将功能传递给一个函数:
>(map (lambda (x) (+ 1 x)) '(-1 2 -3))
(0 3 -2)
拉姆达创建新的匿名功能,这当然每次使用它们的时间进行评估。
让我们创造了价值的临时名称,并在通过让利的形式定义范围使用设置一次。
他们真的是非常不同的东西。
一些例子 :
(拉姆达(X)(* 5×))
(让([×2])(* 5×))10(让([F(拉姆达(X)(* 5×))])(F 2))10
第一种形式创建一个功能通过5至乘
第二形式分配2 x和由5乘以它导致10
第三,我们使用的1的功能(其通过mutiplies 5),并用2调用它在10还产生一个参数
在方案的过程(或函数)是像的列表,一个数字或字符串的第一类对象。要创建一个列表文字使用原始称为list
:
> (define marks (list 33 40 56))
> marks
> (33 40 56)
就这样,创建一个过程,你使用lambda
原语(或特殊形式):
> (define add-marks (lambda (m) (apply + m)))
> (add-marks marks)
> 129
由于程序是抽象的主要形式,计划提供define
的快捷方式,可以很容易绑定新的程序:
> (define (add-marks m) (apply + m))
除此之外,程序就像所有其他的第一类对象。它们可以作为参数传递给其他程序传递和程序可以评估到生产(或退货)另一个程序。
你可以认为它像...你创建使用其他功能的功能,但你想使事情变得更加模块化的,因此你要做的就是调用第二个函数作为第一个参数,并留下您的可能性改变是有道理的,只要你觉得你需要其他的功能,第二...希望