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