我目前正在阅读Mike Vanier撰写的关于 Y-combinator的这篇很棒的文章。在解释中删除了以下行:
事实证明,任何 let 表达式都可以使用以下等式转换为等效的 lambda 表达式:
(let ((x <expr1>)) <expr2>) ==> ((lambda (x) <expr2>) <expr1>)
文章通过转换来说明这个语句:
(define (part-factorial self)
(let ((f (self self)))
(lambda (n)
(if (= n 0)
1
(* n (f (- n 1)))))))
Run Code Online (Sandbox Code Playgroud)
到:
(define (part-factorial self)
((lambda (f)
(lambda (n)
(if (= n 0)
1
(* n (f (- n 1))))))
(self self)))
Run Code Online (Sandbox Code Playgroud)
现在,我明白了上面两个代码片段是如何以及为什么是相同的,尽管我无法理解转换let为的一般方程lambda是:
(let ((x <expr1>)) <expr2>)
==> ((lambda (x) <expr2>) <expr1>)
Run Code Online (Sandbox Code Playgroud)
我很感激详细的解释。
我正在做lambda演算,在我的教科书中,它说你将如何let*使用lambda演算.
我的答案:x,y和z是参数; v1,v2和v3参数; e是身体:
((lambda (x y z) (e)) v1 v2 v3)
Run Code Online (Sandbox Code Playgroud)
书中的答案:
((lambda(x)
((lambda(y)
((lambda(z) e) v3))
v2))
v1)
Run Code Online (Sandbox Code Playgroud)
我不确定我的回答是否相同.如果没有,为什么我的回答是错误的,如何得出原始答案?