第五章函数式程序设计语言 过程式程序设计语言由于数据的名值分离,变 量的时空特性导致程序难于查错、难于修改 命令式语言天生带来的三个问题只解决了一半 滥用goto已经完全解决 悬挂指针没有完全解决 函数副作用不可能消除
第五章 函数式程序设计语言 • 过程式程序设计语言由于数据的名值分离, 变 量的时空特性导致程序难于查错、难于修改 • 命令式语言天生带来的三个问题只解决了一半 • 滥用goto已经完全解决 • 悬挂指针没有完全解决 • 函数副作用不可能消除
°问题是程序状态的易变性( Mutability) 和顺序性( Sequencing Backus在图灵奖的一篇演说《程序设计 能从冯·诺依曼风格下解放出来吗?》中 极力鼓吹发展与数学连系更密切的函数 式程序设计语言
• 问题是程序状态的易变性(Mutability) 和顺序性(Sequencing) • Backus在图灵奖的一篇演说《程序设计 能从冯·诺依曼风格下解放出来吗?》中 极力鼓吹发展与数学连系更密切的函数 式程序设计语言
5.1过程式语言存在的问题 (1)易变性难于数学模型 ·代数中的变量是未知的确定值,而程序 设计语言的变量是对存储的抽象 根本解决:能不能不要程序意义的“变 量”只保留数学意义的“变量”? 能不能消除函数的副作用?
5.1 过程式语言存在的问题 (1)易变性难于数学模型 • 代数中的变量是未知的确定值,而程序 设计语言的变量是对存储的抽象 • 根本解决: 能不能不要程序意义的“变 量”只保留数学意义的“变量”? • 能不能消除函数的副作用?
例:有副作用的函数 int sf fun(int x) static int z=0;//第一次装入赋初值 return x+(z++ sf fun(③3)={3|4|5|6|7. //随调用次数而异,不是数学意义的确定函数
例:有副作用的函数 int sf_fun(int x) static int z = 0; //第一次装入赋初值 return x + (z++); sf_fun(3) = {3 |4 | 5 | 6 | 7 …} //随调用次数而异,不是数学意义的确定函数
(2)顺序性更难数学模型 ·顺序性影响计算结果,例如,前述急求值、正规求 值、懒求值同一表达式就会有不同的结果。有副作用 更甚,因而难于为程序建立统一的符号数学理论 应寻求与求值顺序无关的表达方式 理想的改变途径 ·没有变量,就没有破坏性赋值,也不会有引起副作 用的全局量和局部量之分。调用通过引用就没有意义 循环也没有意义,因为只有每次执行循环改变了控制 变量的值,循环才能得到不同的结果 那么程序结构只剩下表达式、条件表达式、递归表达 式
(2)顺序性更难数学模型 • 顺序性影响计算结果, 例如, 前述急求值、正规求 值、懒求值同一表达式就会有不同的结果。有副作用 更甚, 因而难于为程序建立统一的符号数学理论。 • 应寻求与求值顺序无关的表达方式 • 理想的改变途径 • 没有变量, 就没有破坏性赋值, 也不会有引起副作 用的全局量和局部量之分。 调用通过引用就没有意义。 循环也没有意义, 因为只有每次执行循环改变了控制 变量的值, 循环才能得到不同的结果。 • 那么程序结构只剩下表达式、条件表达式、递归表达 式