函数式编程学习之路(三)
入门:
函数式编程之艰难,在于这玩意更接近数学,就是数学之"用",大牛们在云端,玩纯数学去了,弄出一堆公式及概念,码农们爬在地上,辛苦耕耘,要的是看得见摸得着的,函数式编程就是要打通两者的桥梁,把数学家弄出来的公式概念,用于耕耘,这是现代化农业,告别刀耕火种,是门实实在在的实践科学.
这两天看了不少概念性的东西,越看越糊涂,但好处是打开了一扇窗,看到了更广阔的计算机科学世界,先整理下:
根源:
数学:数理逻辑
数理逻辑是数学的一个分支,其研究对象是对证明和计算这两个直观概念进行符号化以后的形式系统。
数理逻辑的主要分支包括:模型论、证明论、递归论和公理化集合论。数理逻辑和计算机科学有许多重合之处,这是因为许多计算机科学的先驱者既是数学家、又是逻辑学家,如阿兰·图灵、邱奇等。
柯里-霍华德同构给出了“证明”和“程序”的等价性,这一结果与证明论有关,直觉主义逻辑和线性逻辑在此起了很大作用。λ演算和组合子逻辑这样的演算现在属于理想程序语言。
哲学:哲学逻辑
哲学逻辑是对逻辑更特定于哲学的方面的研究。这个术语相对于数理逻辑
哲学逻辑不关心与思维、情感、想象和类似事物相关的心理过程。它只关心那些有能力为真和假的实体 — 思维、句子、命题。尽管在这个范围内,它还感兴趣于心灵哲学和语言哲学。弗雷格被认为是现代哲学逻辑的缔造者。
哲学逻辑只关心那些有能力为真和假的实体 — 思维、句子、命题。
Peter Wegner和Amnon H. Eden提议了三种范式应用于计算机科学的各个领域:[17]
- “理性主义范式”,将计算机科学看作是数学的分支,在理论计算机科学中很流行,主要利用演绎推理。
- “技术专家范式”,这类范式有着很明显的工程学倾向,尤其是在软件工程领域。
- “科学范式”,人工智能的某些分支可以作为这类范式的代表(比如说对于人工生命的研究)。
科学:计算机科学
计算机科学(Computer Science,有时缩写为CS)是系统性研究信息与计算的理论基础以及它们在计算机系统中如何实现与应用的实用技术的学科。
虽然最初很多人并不相信计算机可能成为科学研究的领域,但是随后的50年里也逐渐被学术界认可。
主要成就
虽然计算机科学被认定为正式学术学科的历史很短暂,但仍对科学和社会作出了很多基础贡献。包括:
- “数字革命”的开端:信息时代与互联网。[13]
- 对于计算和可计算理论的正式定义,证明了存在计算上不可解及难解型问题。[14]
- 程序设计语言的概念,一种在不同抽象级别上精确表达方法信息(methodological information)的工具。[15]
- 在密码学领域,恩尼格玛密码机的破译被视为盟军在二战取得胜利的重要因素。[12]
- 科学计算实现了高复杂度处理的实用价值,以及完全使用软件进行实验。同时也实现了对人类思想的深入研究,使得人类基因组计划绘制人类基因成为可能。[13] 还有探索蛋白质折叠的分布式计算项目Folding@home。
- 算法交易增长了金融市场的经济效益与市场流通性,通过人工智能,机器学习及大规模的统计和数值技术。[16]
- 图像合成[来源请求]
- 自然语言处理,包括语音到文字(speech-to-text)转换、语言间的自动翻译[来源请求]
- 对各种过程的模拟,包括计算流体力学、物理、电气、电子系统和电路,以及同人类居住地联系在一起的社会和社会形态(尤其是战争游戏,war games)。现代计算机能够对这些设计进行优化,如飞机设计。尤其在电气与电子电路设计中,SPICE软件对新的物理实现(或修改)设计具有很大帮助。它包含了针对集成电路的基本设计软件。
计算机科学的领域
作为一个学科,计算机科学涵盖了从算法的理论研究和计算的极限,到如何通过硬件和软件实现计算系统。[18][19] CSAB(以前被叫做Computing Sciences Accreditation Board),由Association for Computing Machinery(ACM)和IEEE Computer Society(IEEE-CS)的代表组成[20],确立了计算机科学学科的4个主要领域:计算理论,算法与数据结构,编程方法与编程语言,以及计算机元素与架构。CSAB还确立了其它一些重要领域,如软件工程,人工智能,计算机网络与通信,数据库系统,并行计算,分布式计算,人机交互,计算机图形学,操作系统,以及数值和符号计算。
在计算机科学的领域里,仔细分析发现有三个重要领域值得关注:
1.计算理论
按照Peter J. Denning的说法,计算机科学的最根本问题是“什么能够被有效地自动化?”[21] 计算理论的研究就是专注于回答这个根本问题,关于什么能够被计算,去实施这些计算又需要用到多少资源。为了试图回答第一个问题,递归论检验在多种理论计算模型中哪个计算问题是可解的。而计算复杂性理论则被用于回答第二个问题,研究解决一个不同目的的计算问题的时间与空间消耗。
著名的“P=NP?”问题,千禧年大奖难题之一,[22] 是计算理论的一个开放问题。
2.算法
算法指定义良好的计算过程,它取一个或一组值作为输入,经过一系列定义好的计算过程,得到一个或一组输出。[23]算法是计算机科学研究的一个重要领域,也是许多其他计算机科学技术的基础。算法主要包括数据结构、计算几何、图论等。除此之外,算法还包括许多杂项,如模式匹配、部分数论等。
3.程序设计语言理论
程序设计语言理论是计算机科学的一个分支,主要处理程序设计语言的设计、实现、分析、描述和分类,以及它们的个体特性。它属于计算机科学学科,既受影响于也影响着数学、软件工程和语言学。它是公认的计算机科学分支。
其它领域
信息与编码理论,形式化方法,并发,并行和分布式系统,数据库和信息检索,应用计算机科学,人工智能,计算机体系结构与工程,计算机图形与视觉,计算机安全和密码学,计算科学(或者科学计算),信息科学,软件工程
到现在为止,我们已经取得了初步的研究成果:
1.弄明白了函数式编程的概念及来历
函数式编程的基础是Lambda演算(科学家喜欢用希腊字母表示一个概念,而函数式编程涉及的概念就是λ)
函数式编程不是函数编程,简单的说,如果你写出了不用变量,没有副作用的函数,可以算是函数式编程.
现有的主流编程语言比如C#, Java, C, C++等都不是函数式编程语言(少量可以支持部分函数式编程),经常听说的纯函数式编程语言是Haskell
2.划定了范围:
基本获取了函数式编程所涉及的概念,领域,科学,知识点的大人本范围,就是本文所整理的知识地图,相关的知识都可以通过上面的去延伸,起码知道了,学习函数式编程,不需要去看.net框架精解,或JAVA函数详解这类书.
3.大体能估计学习的入口点,所需要花的时间等
入口点:函数式编程
然后:λ演算(lambda calculus)
再然后:数理逻辑,哲学逻辑,计算机科学
可以看出,深入下去是无止境的,很可能,我们连λ演算或Haskell都不需要搞清楚,只要弄清无变量无副作用,递归,就可以开始函数式编程了.
4.理清了不少艰深晦涩的计算机科学名词的来龙去脉及基本概念
比如象经常在网上见有人提起的“P=NP?”问题,以前不懂一看有人说P=NP,顿时觉得大牛现身,心中立马产生羞愧感.现在我们知道了如下概念:
计算机科学的最根本问题是“什么能够被有效地自动化?
计算理论的研究就是专注于回答这个根本问题
很可能,计算理论最大的未解决问题就是关于这两类的关系的:P和NP相等吗?就是这个“P=NP?”问题
在2002年对于100研究者的调查,61人相信答案是否定的,9个相信答案是肯定的,22个不确定,而8个相信该问题可能和现在所接受的公理独立,所以不可能证明或证否。[1] 对于正确的解答,有一个$1,000,000美元的奖励。
可见,搞不清楚不是我们的事情.那些号称搞清楚或部分搞清楚的只不过在忽悠人而已.