Lamda 表达式学习(2) ——lamda 变换

回顾λ-calculus语法:

t ::=      terms:

  x      variable

  λx.t    abstraction

  t t     application

λ-变换:保持λ-项含义的同时对其进行变换。

1. α-变换:改变被绑定变量的名称,所代表的含义仍是一样的。

λx.t → λy.t(x:=y)

(将表达式的body t中的所有x的自由出现替换称y)

两个lamda表达式如果可以通过α-变换(可能应用到子项)从一个变换到另外一个,则称他们是全等的。

2. β-规约:对application的变换,表示函数作用的概念。

将t1中所有的自由的x替换为t2作为结果。

不允许任何beta归约的lambda表达式被称为Beta范式。不是所有的表达式都可以归约到范式。

3. η-变换:

Eta-conversion expresses the idea of extensionality, which in this context is that two functions are the same if and only if they give the same result for all arguments. Eta-conversion converts between λx.(f x) and f whenever x does not appear free in f.

时间: 2024-12-19 15:58:14

Lamda 表达式学习(2) ——lamda 变换的相关文章

java8-详解Lamda表达式

一回顾与说明 ????通过之前发布的"Java8Lamda和Stream原理引入"一文章中你已经了解了为什么会有Lamda表达式的由来,Lamda表达式的基本语法等:Lamda表达式简而言之:Lamda表达式本质上就是匿名类,我们称Lamda表达式就是函数式接口的实现: 二Lamda表达式的结构与函数式接口的关系 1准备工作 例子还是之前文章关于车的例子 判断型函数式接口: /** * @Author lsc * @Description <p> </p> *

C#学习记录(七)LINQ语句及LAMDA表达式

LINQ LINQ是一种集成在计算机语言里的信息查询语句,可以让编写者以代码的方式操作数据库. 在C#中,LINQ语句有两种写法. 这是第一种写法 IEnumerable<Customer> result = from customer in customers where customer.FirstName == "Donna“ select customer; 由于这种写法比较容易和SQL语言混淆,所以我更倾向于使用另一种写法 IEnumerable<Customer&g

Lamda 表达式(λ-calculus)学习(1)

(参考:<type and Programming Languages>) 一.语法: t ::=  terms: x  variable λx.t  abstraction t t  application λx.t 可理解为:一个函数,以变量x为参数,返回term t.t是该抽象的body.(lamda表达式的body总是延伸得尽可能长) l 若x在λx.t 的t中出现,称x由该抽象约束(bind),称λx是一个范围为t的binder. l 若x出现在某位置,且没有被一个封闭的x上的抽象约

[.net 面向对象程序设计进阶] (5) Lamda表达式(二) 表达式树快速入门

[.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习表达式在程序设计中的优点:比如构造动态查询.动态构造表达式树完成未知对象属性访问,比反射的性能高出很多.我们可以说表达式树才是Lambda的精髓,是我们必须要熟练掌握并灵活运用的. 1.关于表达式树(Expression Tree) 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如

[.net 面向对象程序设计进阶] (5) Lamda表达式(一) 创建委托

[.net 面向对象程序设计进阶] (5) Lamda表达式(一)  创建委托 本节导读: 通过学习Lambda表达式,学会创建委托和表达式目录树,深入了解Lambda的特性,让你的代码变的更加清晰.简洁.高效. 读前必备: 本节学习前,需要掌握以下知识: A.泛型        (请参考[.net 面向对象编程基础]  (18) 泛型) B.Linq基础 (请参照[.net 面向对象编程基础] (19) LINQ基础) C.Linq使用  (请参照[.net 面向对象编程基础]  (20) L

[.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用

[.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用 本节导读:讨论了表达式树的定义和解析之后,我们知道了表达式树就是并非可执行代码,而是将表达式对象化后的数据结构.是时候来引用他解决问题.而本节主要目的就是使用表达式树解决实际问题. 读前必备: 本节学习前,需要掌握以下知识: A.继承 [.net 面向对象编程基础]  (12) 面向对象三大特性——继承 B.多态 [.net 面向对象编程基础]  (13) 面向对象三大特性——多态 C.抽象类 [.net 面向

JAVA8新特性——Lamda表达式

JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ Lamda表达式,读作λ表达式,它实质属于函数式编程的概念,要理解函数式编程的产生目的,就要先理解匿名内部类. 先来看看传统的匿名内部类调用方式: interface MyInterface{ void lMethod(); } public class Main { public static void test(MyInterface myInterface){ myInterface.lMethod(); } publi

匿名方法与Lamda表达式

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 匿名方法与Lamda表达式 { class Program { static void Main(string[] args) { //任何可以使用委托的地方都可以使用匿名方法,匿名方法就是没有名字的方法. //a指向一个匿名方法 Action a

委托、泛型委托、多播委托 和 lamda表达式

委托基本概念:可以把一个方法作为一个参数传给另一个方法 声明:  方法前加 delegate  关键字 列子: using System; using System.Collections; using System.Collections.Generic; namespace Dome { class dom { static void Main(string[] args) { string[] sname = { "Abc", "dFg", "HjK