函数式程序设计语言.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《函数式程序设计语言.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 程序设计语言
- 资源描述:
-
1、第5章 函数式程序设计语言 过程式程序设计语言由于数据的名值分离,变量的时空特性导致程序难于查错、难于修改 命令式语言天生带来的三个问题只解决了一半 滥用goto已经完全解决 悬挂指针没有完全解决 函数副作用不可能消除 问题是程序状态的易变性(Mutability)和顺序性(Sequencing)Backus在图灵奖的一篇演说程序设计能从冯诺依曼风格下解放出来吗?中极力鼓吹发展与数学连系更密切的函数式程序设计语言5 5.1.1 过程式语言存在的问题过程式语言存在的问题(1 1)易变性难于数学模型易变性难于数学模型 代数中的变量是未知的确定值,而程序设计语言的变量是对存储的抽象 根本解决:能不能
2、不要程序意义的“变量”只保留数学意义的“变量”?能不能消除函数的副作用?例例:有副作用的函数有副作用的函数 int sf_fun(int x)int sf_fun(int x)static int z=0 static int z=0;/第一次装入赋初值第一次装入赋初值 return x+(z+)return x+(z+);sf_fun(3)=3|4|5|6|7 sf_fun(3)=3|4|5|6|7 /随调用次数而异随调用次数而异,不是数学意义的确定函数。不是数学意义的确定函数。(2)顺序性更难数学模型顺序性更难数学模型 顺序性影响计算结果,例如,前述急求值、正规求值、懒求值同一表达式就会有
3、不同的结果。有副作用更甚,因而难于为程序建立统一的符号数学理论。应寻求与求值顺序无关的表达方式 理想的改变途径 没有变量,就没有破坏性赋值,也不会有引起副作用的全局量和局部量之分。调用通过引用就没有意义。循环也没有意义,因为只有每次执行循环改变了控制变量的值,循环才能得到不同的结果。那么程序结构只剩下表达式、条件表达式、递归表达式。5.2 演算 演算是符号的逻辑演算系统,它正好只有这三种机制,它就成为函数式程序设计语言的模型 演算是一个符号、逻辑系统,其公式就是符号串并按逻辑规则操纵 Church的理论证明,演算是个完备的系统,可以表示任何计算函数,所以任何可用演算仿真实现的语言也是完备的。演
4、算使函数概念形式化,是涉及变量、函数、函数组合规则的演算。演算基于最简单的定义函数的思想:一为函数抽象x.E,一为函数应用(x.E)(a)。一切变量、标识符、表达式都是函数或(复合)高阶函数。如x.C(C为常量)是常函数。演算公式举例x x 变量、公式、表达式。(x.(y)x)x.(y)x)函数,体内嵌入应用。(z.(y(z.x)z.(y(z.x)函数,体内嵌入应用,再次嵌入函数。(z.(z y)x)z.(z y)x)应用表达式。x.y.z.(x x.(u v)w)x.y.z.(x x.(u v)w)复杂表达式由于演算中一切语义概念均用表达式表达。为了清晰采用命名替换使之更易读。T=x.y.x
5、 /逻辑真值F=x.y.y /逻辑假值1=x.y.x y /数12=x.y.x(x y)/数2zerop=n.n(x.F)T /判零函数注:zerop中的F、T可以用表达式展开形式语法形式语法核心的演算没有类型,没有顺序控制等概念,程序和数据没有区分。语法极简单::=|.|()|():=基本函数基本函数 TRUE 和FALSE的表达式 T=x.y.x T=x.y.x F=x.y.y F=x.y.y 整数的表达式:0=x.y.y 1=x.y.x y 2=x.y.x(x y)n=x.y.x(x(x y)n个 基本操作函数 not=z.(zF)T)=z.(zx.y.y)(x.y.x)not=z.(z
6、F)T)=z.(zx.y.y)(x.y.x)and=a.b.(ab)F)=a.b.(ab)x.y.y)and=a.b.(ab)F)=a.b.(ab)x.y.y)or=a.b.(aT)b)=a.b.(a x.y.x)b)or=a.b.(aT)b)=a.b.(a x.y.x)b)以下是算术操作函数举例:+=+=add=x.y.a.b.(xa)(ya)b)add=x.y.a.b.(xa)(ya)b)*=multiply=x.y.a.(x(ya)=multiply=x.y.a.(x(ya)*=sqr=x.y.(yx)=sqr=x.y.(yx)identity=x.x /identity=x.x /同一
7、函数同一函数 succ=n.(x.y.nx(x y)/succ=n.(x.y.nx(x y)/后继函数后继函数zerop=n.n(x.F)T zerop=n.n(x.F)T =n.n(z.x.y.y)(x.y.y)/=n.n(z.x.y.y)(x.y.y)/判零判零 函数函数 例:例:3+43+4就写就写add 3 4add 3 4,add 3 add 3返回返回“加加3 3函数函数”应用到应用到4 4上当然就是上当然就是7 7。写全了是:。写全了是:(x.y.a.b.(x a)(y a)b)x.y.a.b.(x a)(y a)b))(p.q.(p(p(p q)(s.t.(s(s(s(s t)
8、(p.q.(p(p(p q)(s.t.(s(s(s(s t)a.b.(a(a(a(a(a(a(a b)a.b.(a(a(a(a(a(a(a b)归约与范式归约与范式归约将复杂的表达式化成简单形式,归约将复杂的表达式化成简单形式,即按一定的即按一定的规则对符号表达式进行置换。规则对符号表达式进行置换。例例:归约数归约数1 1的后继的后继 (succ 1)=(succ 1)=(nn.(x.y.n x(x y).(x.y.n x(x y)1 1)=(=(x.y.1 x(x y)x.y.1 x(x y)=(x.y.(=(x.y.(pp.q.p q).q.p q)x x(x y)(x y)=(=(x.y
9、.(q.x q)(x y)x.y.(q.x q)(x y)=(x.y.x(x y)=2 =(x.y.x(x y)=2注:注:succsucc和和1 1都是函数都是函数(1(1是常函数是常函数),第一步是,第一步是nn束定的束定的n n被被1 1置换。置换。展开后,展开后,x x置换置换p p,(xy)(xy)置换置换q q,最后一行不能再置换了,最后一行不能再置换了,它就是范式,它就是范式,语语义为义为2 2。(1 1)归约归约:归约的表达式是一个归约的表达式是一个应用表应用表达式达式(x.M N)x.M N),其左边子表达式是其左边子表达式是函数表函数表达式,右边是任意达式,右边是任意表达式
10、。表达式。归约以右边的归约以右边的表达式置换函数体表达式置换函数体M M中中指明的那个形参变量。指明的那个形参变量。形式地,我们用形式地,我们用 N/X,MN/X,M表示对(表示对(x.M Nx.M N)的的置换置换(规则(规则略)。略)。关键的问题是注意函数体中要置换的变量是否关键的问题是注意函数体中要置换的变量是否自由出现,如:自由出现,如:(x.x(x.(xy)(zz)x.x(x.(xy)(zz)=(zz)(x.(zz)y)=(zz)(x.(zz)y)/错误,第二错误,第二x x个非自由出现。个非自由出现。=(=(zz)(x.(xy)/zz)(x.(xy)/正确例例5 5-5-5 高层表
11、示的高层表示的归约归约(n.add n n)3n.add n n)3 =add 3 3 /3 =add 3 3 /3置换置换n n后取消后取消nn =6 =6(f.x.f(f x)succ 7(f.x.f(f x)succ 7 =x.succ(succ x)7 =x.succ(succ x)7 =succ(succ 7)=succ(succ 7)=succ(8)=9 =succ(8)=9注注:addadd,3 3,succ succ,7 7,9 9是为了清晰没进是为了清晰没进 一步展开为一步展开为表达式。表达式。但但归约有时并不能简化归约有时并不能简化,如如:(x.xx)(x.xx)x.xx)
12、(x.xx),归约后仍是原公式,归约后仍是原公式,这种这种表达式称为不可归约的。表达式称为不可归约的。对应为程序设对应为程序设计语言中的无限递归。计语言中的无限递归。(2)(2)归约是消除一层约束的归约归约是消除一层约束的归约:x.Fx=Fx.Fx=F (3)(3)换名换名:归约中如发生改变束定性质,归约中如发生改变束定性质,则允则允许换名许换名(后跟的变量名后跟的变量名),以保证原有束定以保证原有束定关系。关系。例如:例如:(x.(y.x)(z y)/(zy)x.(y.x)(z y)/(zy)中中y y是自由变量是自由变量 =y.(zy)/y.(zy)/此时此时(zy)zy)中中y y被束定
13、了,被束定了,错误!错误!=(=(x.(w.x)(zy)/x.(w.x)(zy)/因因(y.x)y.x)中函数体中函数体 无无y y,可换名可换名 =w.(zy)/w.(zy)/正确!正确!(4)(4)归约约定归约约定 顺序顺序:每次归约只要找到可归约的子公式即可归每次归约只要找到可归约的子公式即可归约,约,演算没有规定顺序。演算没有规定顺序。范式范式:符号归约当施行(除符号归约当施行(除规则外)所有变换规则外)所有变换规则后没有新形式出现,则这种规则后没有新形式出现,则这种表达式叫范式。表达式叫范式。解释解释:范式即范式即演算的语义解释,演算的语义解释,形如形如 x xx x,(y(x.z)
14、(y(x.z)就只能解释为数据了就只能解释为数据了。上述基本函数均为范式,上述基本函数均为范式,在它的上面取上有意义在它的上面取上有意义的名字可以构成上一层的函数,的名字可以构成上一层的函数,如:如:pred=n.(subtract n 1)pred=n.(subtract n 1)(5)综合规约例题综合规约例题:以以演算规约演算规约3 3*2 2 3 3*2=2=*(3)(2)(3)(2)=x.y.(y x)(3)(2)x.y.(y x)(3)(2)(y.(y 3)(2)(y.(y 3)(2)(2)3)(2)3)=(f.c.f(f c)(3)(f.c.f(f c)(3)c.(3(3 c)c.
15、(3(3 c)=c.(f.c.(f(f(f(c)(3 c)c.(f.c.(f(f(f(c)(3 c)/有有c c不能置换不能置换c c c.(f.z.(f(f(f(z)(3 c)c.(f.z.(f(f(f(z)(3 c)c.(z.(3 c)(3 c)(3 c)(z)c.(z.(3 c)(3 c)(3 c)(z)/再展再展3 3=c.z.(c.z.(f.c.(f(f(f(c)c)(3c)(3c)(z)f.c.(f(f(f(c)c)(3c)(3c)(z)c.z.(c.z.(f.w.(f(f(f(w)c)(3c)(3c)(z)f.w.(f(f(f(w)c)(3c)(3c)(z)c.z.(w.(c(c
16、(c(w)(3c)(3c)(z)c.z.(w.(c(c(c(w)(3c)(3c)(z)/同理展开第二个同理展开第二个c,c,第三个第三个c c=c.z.(w.(c(c(c(w)(c.z.(w.(c(c(c(w)(p.(c(c(c(p)(p.(c(c(c(p)(q.(c(c(c(q)(z)q.(c(c(c(q)(z)c.z.(w.(c(c(c(w)(c.z.(w.(c(c(c(w)(p.(c(c(c(p)(c(c(c(z)p.(c(c(c(p)(c(c(c(z)c.z.(w.(c(c(c(w)(c.z.(w.(c(c(c(w)(c(c(c(c(c(c(z)(c(c(c(c(c(c(z)c.z.(
17、c(c(c(c(c(c(c(c(c(z)=9 c.z.(c(c(c(c(c(c(c(c(c(z)=9增强增强演算演算只用最底层只用最底层演算是极其复杂的。用高层命名函数,语义演算是极其复杂的。用高层命名函数,语义清晰。不仅如此,保留一些常见关键字,语义更清晰。例清晰。不仅如此,保留一些常见关键字,语义更清晰。例如,我们可以定义一个如,我们可以定义一个if_then_elseif_then_else为名的函数:为名的函数:if_then_else=p.m.n.p m nif_then_else=p.m.n.p m n,当当p p为为 真真 时,时,执执行行m m否则为否则为n n。我们先验证其真
18、伪。我们先验证其真伪。例例:当条件表达式为真时当条件表达式为真时if_then_elseif_then_else函数的归约函数的归约(if_then_else)T M Nif_then_else)T M N=(p.m.n.p m n)T M N=(p.m.n.p m n)T M N=(m.n.(T m n)M N=(m.n.(T m n)M N=(m.n.(x.y.x)m n)M N=(m.n.(x.y.x)m n)M N=(m.n.(y.m)n)M N=(m.n.(y.m)n)M N=(m.n.m)M N=(m.n.m)M N=(n.M)N=(n.M)N=M=M ifif表达式表达式 可保留
19、显式if-then-else形式:(if_then_else)E1 E2 E3=if E1 then E2 else E3 其中E1,E2,E3为表达式。Let/whereLet/where表达式表达式 如果有高阶函数:如果有高阶函数:(n.multiply n(succ n)(add i 2)n.multiply n(succ n)(add i 2)=multiply(add i 2)(succ(add i 2)multiply(add i 2)(succ(add i 2)/n n 和和 add i 2add i 2置换变元得置换变元得=multiply n(succ n)/let n=ad
20、d i 2 in multiply n(succ n)/let n=add i 2 in let a=b in E (a.E)b E where a=b let a=b in E (a.E)b E where a=b (f.E2)(x.E1)=let f=x.E1 in E2f.E2)(x.E1)=let f=x.E1 in E2 =let f x=E1 in E2 =let f x=E1 in E2其中形如其中形如f=x.E1f=x.E1的的x.x.可移向左边为可移向左边为f x=E1 f x=E1。如如:sqr=n.multiply n n /sqr=n.multiply n n /整个是
21、整个是函数表达式函数表达式 sqr n=multiply n n /sqr n=multiply n n /两应用表达式也相等两应用表达式也相等 letlet表达式在表达式在ML.LISPML.LISP中直接采用,中直接采用,MirandaMiranda用用wherewhere关键字使程序更好读,关键字使程序更好读,letlet直到直到E E完结构成一个程序块。完结构成一个程序块。MirandaMiranda只不过把只不过把wherewhere块放在块放在E E之后之后.元组表达式元组表达式一般情况下一般情况下n n元组是元组是p=(xp=(x1 1,x,x2 2,x xn n),),建立在建
22、立在p p上上函数有:函数有:let f(xlet f(x1 1,x,x2 2,x xn n)=E1 in E2)=E1 in E2 let fp=E1 in let fp=E1 in let x let x1 1=first p in=first p in let x let x2 2=second p in=second p in .let x let xn n=n_th p in E2=n_th p in E25 5.3.3 函数式语言怎样克服命令函数式语言怎样克服命令式语言的缺点式语言的缺点 5 5.3.1.3.1 消除赋值消除赋值赋值语句在过程语言中起什么作用。在函数式语言中取消会有
23、什么问题:1 存储计算子表达式的中间结果。2 条件语句的重要组成。3 用于循环控制变量。4 处理复杂数据结构(增删改某个成分)。解决办法 1:保留全局量、局部量保留全局量、局部量(符号名符号名)以及参数名以及参数名。22:用条件表达式代替条件语句,其返回值通过用条件表达式代替条件语句,其返回值通过 参数束定或参数束定或wherewhere子句束定于名字子句束定于名字33:函数式语言都要定义表数据结构,函数式语言都要定义表数据结构,因为归约因为归约 和递归计算在表上很方便。和递归计算在表上很方便。对整个表操作实对整个表操作实 则是隐式迭代。则是隐式迭代。不用循环控制变量。不用循环控制变量。对于对
展开阅读全文