如何读取嵌套的lambda函数?

时间:2018-12-06 13:46:01

标签: lambda racket y-combinator

向您展示lambda演算的真正“表现力”。下面的表达式计算10! (十阶因子)主要使用lambda演算的元素,即

  • 标识符
  • 单参数lambdas
  • 函数调用

如果仔细看,您会发现该表达式具有递归元素,这意味着我们可以仅使用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))

0 个答案:

没有答案