什么是拉姆达的方案呢?

问题描述 投票:25回答:6

我学习方案。我知道如何使用这两种拉姆达,让表达式。

不过我在努力搞清楚的一点是使用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
lambda scheme let
6个回答
44
投票

一个letlambda

EG

(let ((x 1))
  body)

可以翻译成

((lambda (x) body) 1)

此外,在方案所有的控制和环境结构可以通过lambda表达式和lambda表达式的应用来表示。

所以,lambda严格大于let更强大,并形成许多方案中发现有趣的结构的基础。

关于definelambda,顶级define增加了一个结合了顶级的环境。

当你写

(define (f x)
  body)

你的意思是说

(define f (lambda (x) body))

嵌套定义被翻译成letrec,其可以使用的lambda以及被重写。

所以,再次,很多方案的构建可以被转换成使用lambda的东西,因此,它是真正的欢颜,你明白lambda好。


14
投票

您可以使用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))

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)

3
投票

拉姆达创建新的匿名功能,这当然每次使用它们的时间进行评估。

让我们创造了价值的临时名称,并在通过让利的形式定义范围使用设置一次。

他们真的是非常不同的东西。

一些例子 :

(拉姆达(X)(* 5×))

(让([×2])(* 5×))10(让([F(拉姆达(X)(* 5×))])(F 2))10

第一种形式创建一个功能通过5至乘

第二形式分配2 x和由5乘以它导致10

第三,我们使用的1的功能(其通过mutiplies 5),并用2调用它在10还产生一个参数


3
投票

在方案的过程(或函数)是像的列表,一个数字或字符串的第一类对象。要创建一个列表文字使用原始称为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))

除此之外,程序就像所有其他的第一类对象。它们可以作为参数传递给其他程序传递和程序可以评估到生产(或退货)另一个程序。


1
投票

你可以认为它像...你创建使用其他功能的功能,但你想使事情变得更加模块化的,因此你要做的就是调用第二个函数作为第一个参数,并留下您的可能性改变是有道理的,只要你觉得你需要其他的功能,第二...希望

© www.soinside.com 2019 - 2024. All rights reserved.