profile photo

一起学习魔法吧(番外篇2)

2020-04-24 22:49:10

任何非常先进的技术,初看都与魔法无异。

λ-calculus

这篇博客我们简单说说 λ-calculus。 在 λ 演算中,每个表达式均代表一个函数,这个函数有一个参数,并返回一个值。故 λ 演算只有一种“类型”,即单参函数。(这也是为什么上一篇博客里说柯里化给予 λ 演算一个理论模型)而函数由 λ 表达式匿名定义,如:f(x) = x * 2 可以写为 λx.x * 2 而 f(4)的值即可表示为(λx.x * 2) 4。 看上去怪怪的,突然冒出来一个孤零零的数字 4,如果有强迫症的话简直不能忍啊!那么我们还可以把它写成下面这个样子: (λf.f 4)(λ.x x * 2)这回看着规整了一些。(λf.f 4)表示的是这个函数接受一个函数作为参数,并作用在 4 上。 就如同任何编程语言都有语法一样,λ 演算也需要语法。λ 演算将符合这些语法的表达式也称作“lambda 项”其语法可归纳成三条规则:

Church 数

Church 数 0, 1, 2, ...在 lambda 演算中被定义如下:

    0 ≡ λf.λx. x
    1 ≡ λf.λx. f x
    2 ≡ λf.λx. f (f x)
    3 ≡ λf.λx. f (f (f x))
    ...
    n ≡ λf.λx. fn x
    ...

这是什么?怎么凭空就能冒出来 0 ≡ λf.λx. x,1 ≡ λf.λx. f x 这种奇怪的东西?我们先回想一下自然数是怎么定义的? 额,像是 0,1,2,3······这种数叫自然数?这种定义太不严谨,我们要用皮亚诺公理定义自然数: