函数式程序设计语言汇总

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

5、FP系统
• “程序”只是没有变量的函数。 • FP系统是建立在使用一固定的函数型集合的基础上的。 这些函数型再加上一些简单的定义,是由已知函数构造 新函数的唯一手段。它们不涉及到变量和代入规则的使 用,而是与程序相伴的代数的运算。
• FP系统的所有函数都是同一类型的, 即从对象到对象的
单一映射。
程序设计能从冯· 诺依曼式的设计风格 中解放出来吗?
函数式程序设计及其程序代数
John Backus于1977年接受ACM图灵奖时的讲演稿
4、冯· 诺依曼和函数式程序的比较
• 求内积的冯· 诺依曼程序
该程序值得注意的几个性质:
1) 2) 3) 4) 5) 6) 7) 程序中的语句以某种复杂的规则作用在不可见的“状态”上。 程序不是层次性的,除了赋值语句的右部外。 程序是动态和重复的。 程序是通过对变量i的修改和赋值语句的重复而逐字计算的。 部分数据(如n)是局部于程序的,因而缺少通用性。 程序命名了其中的量, 因而只对名为a 和b 的向量有效。 程序的“内务” 操作是用分散在几处的符号来表示的。
• 求内积的函数式程序
Def Innerproduct ≡ (Insert +)· (Apply To All × )· Transpose 或简写为Def IP ≡ ( / + )·( α× )· Trans 将已知函数组合成新函数的函数型。 f· g 是先作用g再作用f所得的函数。αf是把f作用到每个分量 上的函数。 f : x 表示把f作用到对象x上所得的结果
人有了知识,就会具备各种分析能力, 明辨是非的能力。 所以我们要勤恳读书,广泛阅读, 古人说“书中自有黄金屋。 ”通过阅读科技书籍,我们能丰富知识, 培养逻辑思维能力; 通过阅读文学作品,我们能提高文学鉴赏水平, 培养文学情趣; 通过阅读报刊,我们能增长见识,扩大自己的知识面。 有许多书籍还能培养我们的道德情操, 给我们巨大的精神力量, 鼓舞我们前进。
8、作为程序设计语言的FP系统
• 函数f是一个程序, 对象x是存贮单元的内容, f : x
是对存贮单元的内容x作用f后所得到的存贮单元
的内容, 定义集合是程序库, 系统提供的原始函
数和函数型是某种特定的程序设计语言中的基 本语句。 • 一旦选定了原始函数和函数型, FP系统的基本结 构部分便为许多类型的语言提供了各种程序设
Def IP ≡ ( / + )·( α × )· Trans
和冯· 诺依曼程序的比较:
1) 该程序只作用在单个变元上, 没有隐含的状态及状态转换规则。 2) 该程序具有层次性, 它由三个较简单的函数( + , × , Trans ) 和三个函数 型f· g,αf和/f构成。 3) 该程序是静态和非重复的, 无需考虑其执行情况。 4) 该程序作用在整个概念单位上, 而不是作用在单个的字上, 它可分为三步, 但没有一步是重复的。 5) 该程序本身不涉及任何数据, 它是完全通用的, 对任何相容向量对都有效。 6) 该程序对所作用的变元不命名, 因而无需过程说明或复杂的代入规则就 能作用到任一向量对上去。 7) 该程序中所用到的“内务” 函数及函数型在其它许多程序中也是通用的。
计风格和设计能力。
9、 函数式程序设计的数学本质
• 一切问题,归根结底到最后都是数学问题。
• 对于数学函数f(x) = y,无论在什么场景下,都
会得到同样的结果,这个我们称之为函数的确
定性。 • 对于赋值模型,同一个函数,同一个参数,会 在不同的场景下计算出不同的结果。这正是赋 值模型与数学模型的不兼容之处。
• FP语言:开创纯函数语言研究之先河
FP 语言用固定的泛函数结构和一些简单定义作为从现存函数构造 新函数的唯一工具, 没有使用变量和替换规则, 程序的构造可视为程序 代数操作。FP语言摆脱了以λ演算为基础的函数语言中存在的实现和 表达能力方面的问题。 在FP中, 函数是无类型的, 这极大简化了语法和语义, 然而, 由于任 意函数可互相组合, 所以某些总产生⊥的函数也可被构造, 这样当构造 函数时, 程序员必须仔细检查所用的构造函数, 加重了编程负担。
Def IP ≡ ( / + )·( α × )· Trans
IP: < <1, 2, 3>, <6, 5, 4> > = (IP的定义) => ( / + ) · ( α × )· Trans: < <1, 2, 3>, <6, 5, 4> > ( ·的作用) => ( / + ) :( ( α × ) : ( Trans: < <1, 2, 3>, <6, 5, 4> >)) (Trans的作用) => ( / + ) :( ( α × ) : < <1, 6>, <2, 5>, <3, 4> > ) ( α 的作用) => ( / + ) : < × : <1,6 >, ×: <2, 5> , ×: <3, 4> > ( × 的作用) => ( / + ): <6, 10, 12> ( / 的作用) => +: <6, +: <10, 12> > ( + 的作用) => +: <6, 22> ( + 的作用) => 28
FP没有高阶能力, 从而也给表达能力带来了一些影响。
12、函数式程序设计语言介绍
• Miranda语言:商用纯函数语言
Miranda程序是定义、函数和其他数据目标的集合, 写成 递归方程的形式。它无需类型说明, 类型推理由编译器完成。 其用户定义类型的引入主要通过说明一个自由代数实现, 这个 自由代数还可附有一组规则。 很多在其他语言中必须表示成抽象类型的数据类型可在 Miranda中用代数数据类型和相关规则来表示。尽管如此,它 还是提供了抽象类型机制, 通过显式的Abstype说明来实现。
6、FP系统的组成
1 ) 对象集合O;ቤተ መጻሕፍቲ ባይዱ
底元⊥
2 ) 把对象映射成对象的函数f的集合F ; 3 ) 一个运算, 即作用; 4 ) 函数型的集合F , 函数型的作用是将F中的已知函数或对 象组合成新的函数;
5 ) 定义集台D , 它用来足义F 中的某些函数, 并且对每个函
数指定一个名;
7、函数式程序的性质
12、函数式程序设计语言介绍
• Haskell语言:通用的纯函数语言
Yale大学的Hudak等从统一函数语言的目的出发, 设计
了Haskell语言, 它几乎包括了现今函数语言的所有优点, 当
然, 它能否取代现行语言还有特时间来证明。
• 其他函数式语言:Hope,APL,ML,F #,
Scala,Ocaml等……
递归!
11、相关的重要概念
• StackOverflow与尾递归
• 惰性求值与并行 • Lambda演算 • 高阶函数与函数抽象性 • Erlang、Haskell、Miranda、Lisp...
12、函数式程序设计语言介绍
• Lisp语言:最早的函数式语言
McCarthy在1960年创立。其初始动机是为考虑匿名函
• 而函数式程序设计取消了赋值模型,则使数学
模型与编程模型完美地达成了统一。
10、状态到底怎么办?
• 函数式编程是无状态的,可是在现实情况
中,状态不可能一直保持不变,而状态必
然需要改变、传递。所以在函数式程序设
计中将其保存在函数的参数中,作为函数
的附属品来传递。
例:求x的n次方
命令式程序设计 函数式程序设计
① 函数式程序对其作用对象或中间结果不命名, 它不含变
量, 没有循环, 没有控制语句, 也没有过程说明; ② 它不需要初启指令,不是逐字式性质的程序; ③ 它是从简单到复杂逐层构造的; ④ 程序中所用的是普遍适用的内务操作型和运算符;
⑤ 该程序是完全通用的, 当作用对象不满足要求时, 一律
得到结果⊥; ⑥ 它没有限制不必要的求值次序 ; ⑦ 利用代数法则能把该程序变为更“有效”、更易读的程 序(即递归定义的程序)。
—— From wikipedia
• 函数式程序设计是一种程序设计模型,它将计 算机运算看作是数学中函数的计算,并且避免 了状态以及变量的概念。
3、变量的不变性
无论多少个进程在跑,因为我们本身没有赋值操作, 如果有多个进程在同时跑这一个程序, 所以都不会影响到我们的最终结果。 那么程序应该先 desposit 还是先 despositTwice? 采用这样的方式没有办法保持状态,这也就是我们在 之前概念中看到的无状态性。
数的表示, 开发一个用于Al的代数表处理语言。应该说在L
isp开发早期λ演算的影响甚微, 但由于Lisp本身有很好的数 学优美性, 它对函数语言的发展产生了重大影响。 Lisp至今仍是最流行的函数语言, 主要用于智能系统的 编程出于效率的考虑, 它现已变成一种不纯的、有副作用的
函数语言。
12、函数式程序设计语言介绍
1、概论
• 面向过程程序设计 • 面向对象程序设计
• 函数式程序设计
2、什么是函数式程序设计
• In computer science, functional programming is a programming paradigm that treats computation as the evaluation of mathematical functions and avoids state and mutable data.
部分主要的函数式程序设计语言
参考资料
• 函数式编程扫盲篇 http://www.cnblogs.com/kym/archive/2011/03/07/19765 19.html
• John Backus,程序设计能从冯· 诺依曼式的设计风格中解 放出来吗?〔段敏译自Comm. ACM,1978, vol 21, No8 , 朱宗元校〕 • 梅宏,孙永强:函数式、逻辑式和面向对象式程序设计 及其多范例合成语言
相关文档
最新文档