向您展示lambda演算的真正“表现力”。下面的表达式计算10! (十阶因子)主要使用lambda演算的元素,即
如果仔细看,您会发现该表达式具有递归元素,这意味着我们可以仅使用lambda演算来创建递归函数!
下面的代码使用了称为 y-combinator
(((lambda (x)
((lambda (f)
(lambda (n)
(if (equal? n 0) 1 (* n (f (- n 1))))))
(lambda (v) ((x x) v))))
(lambda (x) ((lambda (f)
(lambda (n)
(if (equal? n 0) 1 (* n (f (- n 1))))))
(lambda (v) ((x x) v)))))
11)
这是我们讲座中的一个例子。我们不学习y-combinator。也许这就是为什么很难理解上面的代码的原因。
我试图一步一步地破坏代码,但还是不明白。
;body1
((lambda (x)
((lambda (f)
(lambda (n)
(if (equal? n 0) 1 (* n (f (- n 1))))))
(lambda (v) ((x x) v))))
(lambda (x) ((lambda (f)
(lambda (n)
(if (equal? n 0) 1 (* n (f (- n 1))))))
(lambda (v) ((x x) v)))))
;value1
11
;body2
(lambda (x)
((lambda (f)
(lambda (n)
(if (equal? n 0) 1 (* n (f (- n 1))))))
(lambda (v) ((x x) v))))
;value2
(lambda (x) ((lambda (f)
(lambda (n)
(if (equal? n 0) 1 (* n (f (- n 1))))))
(lambda (v) ((x x) v))))
;body3
lambda (x)
;value3
((lambda (f)
(lambda (n)
(if (equal? n 0) 1 (* n (f (- n 1))))))
(lambda (v) ((x x) v)))
;value3-body
(lambda (f)
(lambda (n)
(if (equal? n 0) 1 (* n (f (- n 1))))))
;value3-value
(lambda (v) ((x x) v))