函数式编程基础-lambda演算

2019-01-142586
陈佳良
web研发

lambda演算

定义

lambda演算的对象是lambda表达式。一个lambda表达式由以下几个部分组成:

  • 变量v1,v2....vn

  • 抽象符号“λ”和点号"."。

  • 括号"()"

    lambda表达式的集合Λ,可以递归地定义:

  • 如果x是一个变量,那么x属于集合Λ。

  • 抽象:如果x是一个变量,并且M属于集合Λ,那么λx.M**属于集合Λ。

  • 应用:如果MN属于集合Λ,那么(MN)属于集合Λ。

    解读:

    • λx.M中的x叫做绑定的变量
    • λx.MM中出现的变量叫做自由变量
    • 举例:(λy.(yx))中的y就是绑定变量,而x就是自由变量。这里的y存在于两个地方
    • 对应关系:抽象对应函数的定义应用对应函数的调用绑定变量对应函数的参数

记法

在lambda表达式含义不变的前提下,可以变成简化形式:

  • 最外层括号可以省略:(MN)可以写作MN。
  • 表达式的应用运算时左关联的,所以MNP相当于是(MN)P。
  • 应用抽象的优先级要高,所以λx.MN的含义为λx.(MN),而不是(λx.M)N,其中的括号也可省略。可以这么理解,确定抽象的范围时,边界尽可能向右延伸。
  • 连续抽象可以缩写,例如:λx.λy.λz.N可以简写成λxyz.N

化约

  • α化约:更改表达式中的绑定变量。

  • β化约:更改表达式主体中的绑定变量为某一个表达式。β化约所依赖的变量替换,用符号记作

    E[V := R],定义为把表达式E中所有自由变量V替换成表达式R。

  • β化约的具体替换过程(x,y:变量,M,N:lambda表达式)

    • x[x := N] ≡ N 将单个变量替换成表达式。
    • y[x := N] ≡ y 如果x≠y,要替换的变量(这里是x)和当前变量(这里是y)不同,当前变(y)保持不变。
    • (M1M2)[x := N] ≡ (M1[x := N]) (M2[x := N]) 对应用表达式进行替换,结果是对表达式的两个组成项分别进行替换。
    • (λx.M)[x := N] ≡ λx.M 对抽象表达式进行替换,假如要替换的变量与绑定变量相同,表达式不变。
    • (λy.M)[x := N] ≡ λy.(M[x := N]) 如果x≠y并且y在N中不是自由变量(对抽象表达式进行替换,假如要替换的变量与绑定的变量不同,并且绑定变量在要被替换的表达式中不是自由变量,对抽象表达式的主体进行变量替换。)
  • 举例:

    • (1)α化约:λx.x变换成λy.y。这就相当于说函数的参数更名。
    • (2)β化约:λx.yx中的x替换成M,变换成了λx.yM。相当于函数的实参传入函数。
分享
点赞3
打赏
上一篇:代理工具Fiddler -调试与替换接口状态
下一篇: Web资源缓存简介