在方案中理解Lambda

在方案中理解Lambda,lambda,scheme,racket,Lambda,Scheme,Racket,我正在准备一个测试,看看我们以前做过的一些测试,有很多技巧性的问题,在这些问题中,你会得到一个带有lambda的令人困惑的方案代码,你需要说明它输出了什么。如果你理解lambda,这看起来很简单,但在阅读了大量scheme教程/课程后,我似乎仍然无法破解这些问题。以下是一些例子: (define y 10) ((lambda (x y) (x (x (x y y) y) y)) (lambda (x y) (+ x y)) 7) 产出28 (define (f x y) (*

我正在准备一个测试,看看我们以前做过的一些测试,有很多技巧性的问题,在这些问题中,你会得到一个带有lambda的令人困惑的方案代码,你需要说明它输出了什么。如果你理解lambda,这看起来很简单,但在阅读了大量scheme教程/课程后,我似乎仍然无法破解这些问题。以下是一些例子:

(define y 10)

((lambda (x y)
   (x (x (x y y) y) y))
 (lambda (x y)
   (+ x y))
 7)
产出28

(define (f x y) (* 5 (+ x y)))
((lambda (y x z)
   (f y (x y z)))
 10
 *
 3)
产出200

有人能带我通过这些例子中的一个或两个,并解释我们是如何得到这些答案的吗?我绞尽脑汁想弄明白这一点。我一直在剖析球拍上的这些问题,看看是否能更好地理解,但运气不好。我去创建了一个帐户就是为了问这个问题。

第二个

(define (f x y) (* 5 (+ x y)))
((lambda (y x z)
   (f y (x y z)))
 10
 *
 3)
首先求解λ
lambda
。在该过程中是
(yxz)
调用由
(fy(xyz))
定义。呼叫是
(10*3)

所以
(fy(xyz))
变成
(f10(*103))
。首先,我们得到
(f1030)

然后应用程序
f
我们得到,
(*5(+1030))
,求解内部
()
,我们得到
(*540)
,最后求解外部
),我们得到
200
第二个

(define (f x y) (* 5 (+ x y)))
((lambda (y x z)
   (f y (x y z)))
 10
 *
 3)
首先求解λ
lambda
。在该过程中是
(yxz)
调用由
(fy(xyz))
定义。呼叫是
(10*3)

所以
(fy(xyz))
变成
(f10(*103))
。首先,我们得到
(f1030)


然后应用过程
f
我们得到,
(*5(+1030))
,求解内部
),我们得到
(*540)
,最后求解外部
),我们得到
200
,对于第一个示例:

程序
(lambda(xy)(x(x(x(y)y)y))通过2个参数x和y:
x
将绑定到
(lambda(xy)(+xy))
,并且
y
将绑定到7

首先,将
y
替换为7将产生以下结果(我已经冒昧地将
x
更改为
f
,因为我发现它更好地显示了参数是一个函数/过程):


现在,内部
(f7)
的计算结果为
(+7)
因此为14。继续替换,这将给出
(f(f 14 7)7))
,然后是
(f 21 7)
,最后是28。

对于第一个示例:

程序
(lambda(xy)(x(x(x(y)y)y))通过2个参数x和y:
x
将绑定到
(lambda(xy)(+xy))
,并且
y
将绑定到7

首先,将
y
替换为7将产生以下结果(我已经冒昧地将
x
更改为
f
,因为我发现它更好地显示了参数是一个函数/过程):


现在,内部
(f7)
的计算结果为
(+7)
因此为14。继续替换这将给出
(f(f 14 7)7))
然后
(f 21 7)
最后是28。

如果您无法按照定义重写lambda

;; original
(define y 10)

((lambda (x y)
   (x (x (x y y) y) y))
 (lambda (x y)
   (+ x y))
 7)

;; could be rewritten with defines as
(define y 10)

(define f
  (lambda (x y)
   (x (x (x y y) y) y))

(define g
  (lambda (x y)
     (+ x y))

(f g 7)
在重写中使用替换,遵循代码非常简单

;; g and 7 are applied to f   
(f g 7)
(g (g (g 7 7) 7) 7)

;; 7 and 7 are applied to g
(+ 7 7)
14

;; which gives us
(g (g 14 7) 7)

;; 14 and 7 are applied to g
(+ 14 7)
21

;; which gives us
(g 21 7)

;; lastly, 21 and 7 are applied to g
(+ 21 7)
28
可以使用相同的方法计算另一个lambda表达式


另一种方法是注意到

(lambda (x y) (+ x y))

+
这意味着你可以将整个问题重写为

((lambda (x y)
   (x (x (x y y) y) y))
 +
 7)
然后使用替换

(+ (+ (+ 7 7) 7) 7)
(+ (+ 14 7) 7)
(+ 21 7)
28

警告:
(定义y 10)
是一种误导。不会使用该值,因为每个lambda使用绑定的
y
变量,并且从不使用外部
y
10


如果您无法按照定义重写lambdas

;; original
(define y 10)

((lambda (x y)
   (x (x (x y y) y) y))
 (lambda (x y)
   (+ x y))
 7)

;; could be rewritten with defines as
(define y 10)

(define f
  (lambda (x y)
   (x (x (x y y) y) y))

(define g
  (lambda (x y)
     (+ x y))

(f g 7)
在重写中使用替换,遵循代码非常简单

;; g and 7 are applied to f   
(f g 7)
(g (g (g 7 7) 7) 7)

;; 7 and 7 are applied to g
(+ 7 7)
14

;; which gives us
(g (g 14 7) 7)

;; 14 and 7 are applied to g
(+ 14 7)
21

;; which gives us
(g 21 7)

;; lastly, 21 and 7 are applied to g
(+ 21 7)
28
可以使用相同的方法计算另一个lambda表达式


另一种方法是注意到

(lambda (x y) (+ x y))

+
这意味着你可以将整个问题重写为

((lambda (x y)
   (x (x (x y y) y) y))
 +
 7)
然后使用替换

(+ (+ (+ 7 7) 7) 7)
(+ (+ 14 7) 7)
(+ 21 7)
28

警告:
(定义y 10)
是一种误导。不会使用该值,因为每个lambda使用绑定的
y
变量,并且从不使用外部
y
10


尝试使用Racket的调试器,它将完成每个步骤。远比用文字解释更能说明问题;)尝试使用Racket的调试器,它将完成每个步骤。远比用文字解释更能说明问题;)谢谢那么,顶部的(定义y10)是怎么回事呢?我不习惯看到define后面的括号中没有函数名,那么这部分到底是什么意思呢?还有,10只是一个诱饵吗?有10个有什么意义?嗯,它是测试的一部分,因此很容易成为诱饵,但就语法而言,它实际上有什么用途吗?如果
y
是代码中的某个“自由”变量,则会使用
y
,但它不是。如果运行代码时没有定义
define
,则结果完全相同。是的,这是个骗局。根据维基百科的说法,“在计算机编程中,术语自由变量指的是函数中使用的变量,它既不是局部变量,也不是该函数的参数。术语非局部变量在这种情况下通常是同义词。”()谢谢!那么,顶部的(定义y10)是怎么回事呢?我不习惯看到define后面的括号中没有函数名,那么这部分到底是什么意思呢?还有,10只是一个诱饵吗?有10个有什么意义?嗯,它是测试的一部分,因此很容易成为诱饵,但就语法而言,它实际上有什么用途吗?如果
y
是一个“自由”变量,那么将使用
y
的值