函数式编程学习之路(三)
入门:
函数式编程之艰难,在于这玩意更接近数学,就是数学之"用",大牛们在云端,玩纯数学去了,弄出一堆公式及概念,码农们爬在地上,辛苦耕耘,要的是看得见摸得着的,函数式编程就是要打通两者的桥梁,把数学家弄出来的公式概念,用于耕耘,这是现代化农业,告别刀耕火种,是门实实在在的实践科学.
这两天看了不少概念性的东西,越看越糊涂,但好处是打开了一扇窗,看到了更广阔的计算机科学世界,先整理下:
根源:
数学:数理逻辑
数理逻辑是数学的一个分支,其研究对象是对证明和计算这两个直观概念进行符号化以后的形式系统。
数理逻辑的主要分支包括:模型论、证明论、递归论和公理化集合论。数理逻辑和计算机科学有许多重合之处,这是因为许多计算机科学的先驱者既是数学家、又是逻辑学家,如阿兰·图灵、邱奇等。
柯里-霍华德同构给出了“证明”和“程序”的等价性,这一结果与证明论有关,直觉主义逻辑和线性逻辑在此起了很大作用。λ演算和组合子逻辑这样的演算现在属于理想程序语言。
哲学:哲学逻辑
哲学逻辑是对逻辑更特定于哲学的方面的研究。这个术语相对于数理逻辑
哲学逻辑不关心与思维、情感、想象和类似事物相关的心理过程。它只关心那些有能力为真和假的实体 — 思维、句子、命题。尽管在这个范围内,它还感兴趣于心灵哲学和语言哲学。弗雷格被认为是现代哲学逻辑的缔造者。
哲学逻辑只关心那些有能力为真和假的实体 — 思维、句子、命题。
计算机科学的哲学
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美元的奖励。
可见,搞不清楚不是我们的事情.那些号称搞清楚或部分搞清楚的只不过在忽悠人而已.
函数式编程学习之路(三)相关推荐
- 函数式编程学习之路(一)
起点: 作为一个比较资深的码农,写程序是有些年头了.最早用过C,VB,Delphi等写过不少过程式代码. 后来,04,05年左右吧,为了提升技术,仔细思考学习了面向对象,终于有一天开悟,基本上算是进入 ...
- Java 8 函数式编程学习笔记
Java 8 函数式编程学习笔记 @(JAVASE)[java8, 函数式编程, lambda] Java 8 函数式编程学习笔记 参考内容 Java 8中重要的函数接口 扩展函数接口 常用的流操作 ...
- 【Java】函数式编程学习笔记——Stream流
学习视频:https://www.bilibili.com/video/BV1Gh41187uR?p=1 (1)[Java]函数式编程学习笔记--Lambda表达式 (2)[Java]函数式编程学习笔 ...
- 【编程学习】每天进步一点点,编程学习之路:一款表格数据处理软件 - CSV表格数据处理器v1.0.1
[编程学习]每天进步一点点,编程学习之路:一款表格数据处理软件 - CSV表格数据处理器v1.0.1 写在前面1:软件编写缘由 在读研实习期间,因为公司时常有处理大量表格数据的需求,加上自己有一些Py ...
- 编程学习之路记录重新开始
编程学习之路记录重新开始 2017年起始 记录重头开始--------------
- 写给编程初学者的一篇文章,该如何学习编程?我的编程学习之路
我的编程之路 当初还没有学习编程的时候,真心觉得编程好难啊,这是人学的吗?怎么全是符号字母?这都是啥啊?真的是让人满头问号,目前编程行业工资比较高,很多人都想学一下编程,但又不知道从哪里开始学习,我觉 ...
- Java8-----系统复习及扫盲(3)--函数式编程学习
原文出处: 琴水玉 引子 将行为作为数据传递 怎样在一行代码里同时计算一个列表的和.最大值.最小值.平均值.元素个数.奇偶分组.指数.排序呢? 答案是思维反转!将行为作为数据传递. 文艺青年的代码如下 ...
- typescript学习之路(三) —— ts定义类的方法(包含es5以及es6的定义类)
提起类,不得不说一下,强类型编程语言,如php,java,c++等都有类的概念.而js作为一门弱类型语言,是没有类这个概念的,虽然也能模拟类的实现,但总归不是类.so,ts也只是模拟类而已,使得更贴切 ...
- Java函数式编程学习——Stream流
目录 概述 案例数据准备 1. 常用操作 2. 中间操作 filter map distinct sorted limit skip flatMap 3. 终结操作 foreach count max ...
最新文章
- F5发布最新文件虚拟化存储产品ARX 4000
- 盘点上海AI行业的10岁、20岁和30岁们
- 【opencv】边缘提取或通过二值图片提取对应的三维图像(python)
- 文巾解题 929. 独特的电子邮件地址
- 听听一个院士的故事,你也能找到自己的路。
- ECCV18|人脸对齐与跟踪如何克服遮挡、姿态变化带来的特征点跳变?
- 借势炒作?巴菲特午宴中标者孙宇晨怼完王小川再怼王思聪:靠爹的骂靠自己的...
- 字节跳动面试真题:java实现远程控制
- JEPLUS之特殊字段类型的使用——JEPLUS软件快速开发平台
- java中的并发是什么意思_java中的并发是什么
- 2分钟教你部署2048小游戏到云服务器
- 使用SQL查询分析器删除所有用户表
- 凤凰项目:一个IT运维的传奇故事--阅读心得
- 公专网集群对讲系统在城市执法过程中的应用
- raid0 trim linux,6系主板泪流满面,终于支持RAID 0模式下的TRIM了
- Justinmind教程(3)——管理原型
- Java字符串(超超超详细)
- 计算机图形杂志,计算机图形学顶级杂志、会议、期刊
- shell几个基础问题(基础进阶)
- 用个人博客打造一个酷酷的工作流
热门文章
- python爬虫requests实战_Python_爬虫_requests小实战
- vuecli3 引入全局scss变量_vuecli3 从搭建到优化
- html 打印时隐藏,html 打印相关操作与实现详解
- python get方法请求参数_python中requests库get方法带参数请求
- Mysql 主从延时监控(pt-heartbeat)详解
- Linux中查看版本信息命令介绍
- [湖南集训]更为厉害 树上主席树-以树深度为下下标建立主席树
- python怎么打包压缩文件_Python打包文件夹的方法小结(zip,tar,tar.gz等)
- sqoop mysql parquet_sqoop一些语法的使用
- 西安java招聘_西安招聘 | 陕西安控科技公司招聘(员工宿舍、节日福利、餐补)...