(原)函数式编程

核心概念

  • 函数式一等公民(输入输出啥的都可以是函数);
  • 纯函数,固定输入带来固定输出;
  • 阅读性良好,无并发问题,但效率偏低;

大历史背景

  • 旨在描述问题如何计算:

    有两位巨擘对问题的可计算性做了模型化描述

    一位是阿兰.图灵(Alan Turing),他提出的图灵机。

    另外一个位巨擘,是阿隆佐·邱奇(Alonzo Church)。他提出了Lambda演算(Lambda Calculus)的概念

计算则指数学意义上的计算,越是抽象的计算,离计算机硬件越远。

对应到编程语言,就是越低级的语言,越贴近计算机,抽象程度低,执行效率高,比如C语言;越高级的语言,越贴近计算,抽象程度高,执行效率低,比如Lisp语言。

函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。

概念解读

  • 函数:不是面向对象中的函数,强调的是数据之间的映射关系。
  • 要求都是纯函数;
  • 变量指的是数学中的变量;
  • 使用表达式而不要使用语句——即每个都要有返回值;
  • 状态保留在中间,而不能依赖外部状态;

优缺点

  • 引用透明(不依赖外部)
  • 效率高(开发)
  • 无并发编程问题;
  • 可读性好;
  • 占用大量资源;

函数式编程和面向对象编程各有利弊,一个语法更加自由,一个健壮性更好。作为程序员应该对两种编程方式都有所了解,不管是哪种方式,只要能够很好的解决当前的问题就是正确的方式,毕竟对于软件工程来说解决问题是最主要的,用的工具反而没有那么重要,就像对程序员来说语言不重要,重要的是解决问题的思想。

现在这两者的发展趋势是相互借鉴的,许多以面向对象作为基础的语言例如Java等都在新的版本中添加了对函数式编程的支持,而函数式编程则借鉴了一些在面向对象语言里用的一些编译技巧使得程序运行更快。

参考文章

  • 函数式编程介绍
  • 函数式编程与面向对象编程的比较
  • 函数式编程

(更新)命令式编程和声明式编程

前者是指导程序做啥做啥,后者是告诉程序我想要做啥做啥你给我做(通过函数)

命令式编程:命令“机器”如何去做事情(how),这样不管你想要的是什么(what),它都会按照你的命令实现。

声明式编程:告诉“机器”你想要的是什么(what),让机器想出如何去做(how)。

举个栗子

//命令式
var numbers = [1,2,3,4,5]
var doubled = []
for(var i = 0; i < numbers.length; i++) {var newNumber = numbers[i] * 2doubled.push (newNumber)
}
console.log (doubled) //=> [2,4,6,8,10]//声明式
var numbers = [1,2,3,4,5]
var doubled = numbers.map (function (n) {return n * 2
})
console.log (doubled) //=> [2,4,6,8,10]
  • 命令式多用于描述业务逻辑;
  • 声明式更加抽象;
  • 声明式不包含循环;
  • 声明式不保存变量值,也不改变外部数值;
  • SQL就是典型的声明式;
//声明式
SELECT * from dogs
INNER JOIN owners
WHERE dogs.owner_id = owners.id//命令式
//dogs = [{name: 'Fido', owner_id: 1}, {...}, ... ]
//owners = [{id: 1, name: 'Bob'}, {...}, ...] var dogsWithOwners = []
var dog, owner
for(var di=0; di < dogs.length; di++) {dog = dogs[di]for(var oi=0; oi < owners.length; oi++) {owner = owners[oi]if (owner && dog.owner_id == owner.id) {dogsWithOwners.push ({dog: dog,owner: owner})}}}
}

声明式和函数式

  • 思想一致,关注做什么而不是怎么做;
  • 函数式更强调函数的一等公民地位,直接对函数操作;

参考文章

  • 声明式编程和命令式编程的比较
  • 编程范式:命令式编程(Imperative)、声明式编程(Declarative)和函数式编程(Functional)

转载于:https://www.cnblogs.com/andy1202go/p/9706785.html

【技术累积】【点】【编程】【13】XX式编程相关推荐

  1. java链式编程_Java 链式编程 和 lombok 实现链式编程

    一.链式编程定义 链式编程的原理就是返回一个this对象,就是返回本身,达到链式效果. 二.jdk中 StringBuffer 源码 我们经常用的 StringBuffer 就是 实现了链式的写法. ...

  2. 【程序设计】交互式编程与脚本式编程

    文章目录 交互式编程 Java交互式编程 Python交互式编程 JavaScript交互式编程 脚本式编程 Python脚本式编程 JavaScript脚本式编程 交互式编程 Java交互式编程 J ...

  3. java链式编程_Java链式编程学习

    Java链式编程 在使用jquery时肯定对它的链式编程惊艳到,慢慢的其它语言这种编程模式也逐渐增多.其本身并不复杂,在调用方法时,方法最后返回对象本身,以达到链式编程的效果. 链式编程比较简单,只要 ...

  4. 响应式编程以及反应式编程框架Reactor3的简单介绍

    前言 Reactor 3是一个围绕Reactive Streams规范构建的库,它在JVM上引入了响应式编程的一个范例.目前Spring5 引入的Webflux就是reactor 3实现的一个响应式w ...

  5. Lua开发工作笔记0004---交互式编程与脚本式编程及注释的写法

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 如果我们写一个脚本文件,然后打开脚本文件,再执行,这样叫脚本式编程 如果我们通过cmd命令,来编译 ...

  6. 华山论剑之契约式编程与防御式编程

    背景 事情的来由还要从几十几亿年前的一次星球大爆炸说起,sorry,背错台词了,是从几天前讨论接口返回数据和几个月前讨论课件本地数据结构说起,简单的说,就是碰到约定好的内容出现异常,是我们在程序中内部 ...

  7. 契约式编程与防御式编程

    背景 事情的来由还要从几十几亿年前的一次星球大爆炸说起,sorry,背错台词了,是从几天前讨论接口返回数据和几个月前讨论课件本地数据结构说起,简单的说,就是碰到约定好的内容出现异常,是我们在程序中内部 ...

  8. 函数式编程和响应式编程

    到底什么是函数式,他和命令式编程和面向对象有什么区别.(知乎上已经有很多讨论了,感兴趣的话,我在结尾的地方贴了一些链接.) 总的来说,在函数式中,函数是一等公民,函数能作为变量的值,函数可以是另一个函 ...

  9. python 交互式编程与脚本式编程

    交互式编程 交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码. linux上你只需要在命令行中输入 Python 命令即可启动交互式编程,提示窗口如下: $ pytho ...

最新文章

  1. R语言生成组合图并保存实战:实际上只保存了最后一个图问题、ggsave生成组合图并保存(保存完整组合图)
  2. java的sdk在哪个文件夹_我的计算机中的Java SDK文件夹在哪里? Ubuntu 12.04
  3. 博途中用的是c吗_配置太低玩不了赛博朋克?学会用这个电脑、手机都能轻松玩2077...
  4. Apache下如何禁止指定目录运行PHP脚本
  5. 使用中断后不停止_仓鼠偷吃鼠粮,被发现后立刻停止,但鼠鼠满脸不情愿
  6. 排查一个触摸屏驱动问题
  7. 带你了解家居智能的心脏:物联网关
  8. 马斯克开始行动:下调Twitter Blue订阅费 禁止广告
  9. 记录一次在centos下使用gmp的悲伤
  10. 你还因为缺“Java项目经验”找不到工作?适合应届生的20个“项目经验”送给你
  11. ens32文件空白(没有ens33文件)
  12. 图书管理系统—可行性分析报告
  13. win7系统ftp服务器密码修改,win7 ftp服务器密码
  14. 高级变量类型 ---- 字符串
  15. HTML——表格的基本样式
  16. Linux Deploy:在Android上部署Linux
  17. CSAPP Lab:attacklab
  18. HTML table 标签边框问题(隐藏表格边框、单元格边框等)
  19. 基于Visual C++2010 与office2010开发办公自动化(14)-自定义excel2010工具栏
  20. Docker: USER 指定当前用户

热门文章

  1. 帷幕的帷是什么意思_俗语:“宁娶寡妇,不娶生妻!”什么是“生妻”?老祖宗智慧...
  2. python基础教程 pdf github_python基础教程之Jupyter导出PDF从入门到绝望(已解|python基础教程|python入门|python教程...
  3. 大数据如何学习 cda认证_第十届CDA认证考试 LEVEL 1 优秀考生访问录:我是如何备考的?...
  4. 省二c语言笔试试卷,2005年春浙省二级C语言笔试试卷.doc
  5. 【PAT (Advanced Level) Practice】1037 Magic Coupon (25 分)
  6. python【数据结构与算法】最小生成树之Kruskal算法
  7. Python程序设计题解【蓝桥杯官网题库】 DAY11-算法训练
  8. /bin和/lib文件夹的区别
  9. 堆排序最坏时间复杂度
  10. 小学计算机课调研问卷,小学生深度学习--调查问卷(教师专业素养维度)