程序设计语言原理2023-5

VIP免费
2025-01-13 0 0 2.34MB 179 页 5.9玖币
侵权投诉
第五章 函数式程序设计语言
过程式程序设计语言由于数据的名值分离,变量的时空特性导
致程序难于查错、难于修改
命令式语言天生带来的三个问题只解决了一半
滥用goto已经完全解决
悬挂指针没有完全解决
函数副作用不可能消除
OO解决了上述问题吗?
问题是程序状态的易变性(Mutability)和顺序性(Sequencing)
Backus在图灵奖的一篇演说《程序设计能从冯·诺依曼风格下
解放出来吗?》中极力宣扬发展与数学联系更密切的函数式
程序设计语言
5.1 命令式语言存在的问题
(1)易变性难于数学模型
代数中的变量是未知的确定值,而程序设计语言的变量是对存储的抽象
根本解决:能不能不要程序意义的“变量”只保留数学意义的“变量”?
能不能消除函数的副作用?
例:有副作用的函数
int sf_fun(int x)
static int z = 0; //第一次装入赋初值
return x + (z++);
sf_fun(3) = {3 |4 | 5 | 6 | 7 }
//随调用次数而异,不是数学意义的确定函数。
数学函数的特征:
映射表达式的求值顺序由递归表达式和条件表达式控制。
不依赖于任何外部值(无副作用),所以给定相同的自变
量集合,总是映射值域集合中的同一个元素。
面向对象中的可变性和不可变性
可变对象:mutable Object,创建之后状态可以改变的对象
不可变对象:Immutable Object,创建之后状态不可改变的对象。
一个对象包含的内部使用的属性改变了,但从外部看对象的状态并没
有改变,例如一个只披露姓名和性别,但是年龄被隐藏的human被看
作是不可变对象。
Java中关键字final用于声明原始数据类型和对象引用为不可变对象,
但是它不能使对象本身变为不可变对象。
原始数据类型变量(int, long, short等)定义之后还可以再重新赋值,可以使用final阻止这样的赋值。
仅仅使用final关键字还不能让引用类型(reference types)成为不可变对象,final只能阻止重新赋值。
原始类型包装类(Integer、Long、Short、Double、Float、
Character、Byte、Boolean)也都是不可变的。
2顺序性更于难数学模型
顺序性影响计算结果,例如,急求值、正规求值、懒
求值同一表达式就会有不同的结果。有副作用更甚,
因而难于为程序建立统一的符号数学理论。
应寻求与求值顺序无关的表达方式
变元求值策略/求值顺序的影响
ML:fun sqr(n : int) = n*n
若p=2,q=5有调用
sqr ( p + q ) = sqr ( 2 + 5 ) = 7 * 7 = 49
急求值:表达式先求值再入体。
正规求值:
(p+q) * (p+q) = (2+5)*(2+5) = 7 * 7 = 49
按λ演算,先置换原表达式,体中代入值计算
懒求值:
(p+q) * (p+q) = (2+5) * (2+5) = (2+5) * 7 = 49
只在界面置换原表达式,何时用该值何时计算,相同的只算一次
2顺序性更于难数学模型
理想的改变途径
没有变量,就没有破坏性赋值,也不会有引起副作用的全局量和局部量之分。
通过引用调用就没有意义。
循环也没有意义,因为只有每次执行循环改变了控制变量的值,循环才能得
到不同的结果。
那么程序结构只剩下表达式条件表达式递归表达式
Church-Rosser性质:
表达式的完全求值,仅当它前后一致地按正规顺序求值,几种求
值方式得的结果应一致。若一表达式能以几种不同的求值次序求值
(包括混合使用几种求值方案),则所有这些求值次序得到的结果
值应该是一样的。
急求值
急求值是严格求值(Strict),完全求值
急求值对应值调用,最安全
fun cand (b1:bool,b2:bool)=
if b1 then b2
else false
有函数调用cand (n>0,t/n>0.5) 若n=0,t=0.8
若急求值,第二子表达式未结合即失败
满足Church-Rosser性质:
表达式的完全求值,仅当它前后一致地按正规顺序求值,几种求值方式
得的结果应一致。
摘要:

第五章函数式程序设计语言过程式程序设计语言由于数据的名值分离,变量的时空特性导致程序难于查错、难于修改命令式语言天生带来的三个问题只解决了一半滥用goto已经完全解决悬挂指针没有完全解决函数副作用不可能消除OO解决了上述问题吗?问题是程序状态的易变性(Mutability)和顺序性(Sequencing)Backus在图灵奖的一篇演说《程序设计能从冯·诺依曼风格下解放出来吗?》中极力宣扬发展与数学联系更密切的函数式程序设计语言5.1命令式语言存在的问题(1)易变性难于数学模型代数中的变量是未知的确定值,而程序设计语言的变量是对存储的抽象根本解决:能不能不要程序意义的“变量”只...

展开>> 收起<<
程序设计语言原理2023-5.pdf

共179页,预览36页

还剩页未读, 继续阅读

声明:本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。玖贝云文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知玖贝云文库,我们立即给予删除!
分类:计算机 价格:5.9玖币 属性:179 页 大小:2.34MB 格式:PDF 时间:2025-01-13

开通VIP享超值会员特权

  • 多端同步记录
  • 高速下载文档
  • 免费文档工具
  • 分享文档赚钱
  • 每日登录抽奖
  • 优质衍生服务
/ 179
客服
关注