函数编程(简称FP)不只代指Haskell Scala等之类的语言,还表示一种编程范式,和面向对象的编程方式一样,是编程思维,软件思考方式,也称面向函数编程。 编程的本质是组合,组合的本质是范畴Category,而范畴是函数的组合。

函数式编程的特点:函数是第一公民,无副作用,内部不存在状态,易于并发。

面向对象编程主要有三点特性:封装,多态,继承,把所有的事物都当做对象来看待,任何事物皆对象。

  • 封装就是把对象的属性和对象的行为封装到一个定义的类里面。
  • 多态就是同一个对象可以表现为多种具体的形式。
  • 继承就是子类可以继承父类的属性和行为。

OOP主要聚焦于数据的区别,而FP则注重数据结构的一致性。

面向对象:

    • 数据和对数据的操作紧紧耦合。
    • 对象隐藏它们操作的实现细节,其他对象调用这些操作只需要通过接口。
    • 核心抽象模型是数据自己。
    • 核心活动是组合新对象和拓展已经存在的对象,这是通过加入新的方法实现的。

函数编程:

    • 数据与函数是松耦合的
    • 函数隐藏了它们的实现,语言的抽象是函数,以及将函数组合起来表达。
    • 核心抽象模型是函数,不是数据结构
    • 核心活动是编写新的函数。
    • 变量缺省是不变的,减少可变性变量的使用,并发性好

函数风格的编程特点:

    1. 第一等公民是函数
    2. 带有闭包的Lambdas/Anonymous函数
    3. 不变性,大部分无态处理,没有状态和变量
    4. 高并发
    5. 无副作用的调用
    6. 通过tail call实现递归的性能优化。
    7. 模式匹配(Haskell, Erlang)
    8. 懒赋值(Miranda, Haskell)
    9. Homoiconicity(类似LISP)

面向对象和函数式编程结合起来,能够极大的简化我们的编程工作,写出跟易于扩展的和可读的代码。在设计上,两者思想是想通的。在不同的领域里面,用不同的思想去设计程序,这个是需要我们分析的。

其实面向对象程序中的设计模式,很多和函数式编程里面的思想想通。我们常用的模板模式和回调模式和函数式编程里面的高阶函数设计思想类似,当设计能力达到一定层次之后,在去看函数式编程,就会对设计模式的理解更加深入。

面向对象和面向函数一直在争论,实际上纯粹的OOP和纯粹的FP都是极端的,对于OOP来讲:存在的并一定都是对象,函数就不是对象;对于FP来说:存在的并不总是纯粹的,副作用总是真实存在。面向对象侧重于分解,函数编程侧重于组合。

2017.4.9 函数式编程FP的更多相关文章

  1. 可爱的 Python : Python中的函数式编程,第三部分

    英文原文:Charming Python: Functional programming in Python, Part 3,翻译:开源中国 摘要:  作者David Mertz在其文章<可爱的 ...

  2. 可爱的 Python : Python中函数式编程,第二部分

    英文原文:Charming Python: Functional programming in Python, Part 2,翻译:开源中国 摘要:  本专栏继续让David对Python中的函数式编 ...

  3. Scala函数式编程(三)

    Scala既是一门面向对象(OOP)语言,又是一门函数式编程(FP)语言.作为一门支持函数式编程的语言,Scala鼓励面向表达式编程(EOP)模型.简单来说,EOP中每个语句都有返回值.这一模式很明显 ...

  4. .NET并发编程-函数式编程

    本系列学习在.NET中的并发并行编程模式,实战技巧 函数式编程 和面向过程编程POP(procedure oriented Programming)面向对象编程OOP(object oriented ...

  5. 编程范式 --- 函数式编程(Funtional Programming,简称FP)

    函数式编程(Funtional Programming,简称FP)是一种编程范式,也就是如何编写程序的方法论 主要思想:把计算过程尽量分解成一系列可复用函数的调用 主要特征:函数是"第一等公 ...

  6. [2017.02.23] Java8 函数式编程

    以前学过Haskell,前几天又复习了其中的部分内容. 函数式编程与命令式编程有着不一样的地方,函数式编程中函数是第一等公民,通过使用少量的几个数据结构如list.map.set,以及在这些数据结构上 ...

  7. Atitit 函数式编程与命令式编程的区别attilax总结  qbf

    Atitit 函数式编程与命令式编程的区别attilax总结  qbf 1.1. 函数式程序就是一个表达式.命令式程序就是一个冯诺依曼机的指令序列. 命令式编程是面向计算机硬件的抽象,有变量(对应着存 ...

  8. paip. java的 函数式编程 大法

    paip. java的 函数式编程 大法 Java 语言中常被忽视的一个方面是它被归类为一种命令式(imperative)编程语言.命令式编程虽然由于与 Java 语言的关联而相当普及,但是并不是惟一 ...

  9. paip.函数式编程方法概述以及总结

    paip.函数式编程方法概述以及总结 1     函数式编程:函数式风格..很多命令式语言里支持函数式编程风格 1.1      起源 (图灵机,Lisp机器, 神经网络计算机) 1.2      函 ...

随机推荐

  1. Java Web(十二) JavaMail发送邮件

    发送邮件的原理 概叙 邮件服务器: 要在 Internet 上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在 Internet 很多 提供邮件服务的厂商:sina.sohu.163 等等他们都 ...

  2. js 日期格式化函数(可自定义)

    js 日期格式化函数 DateFormat var DateFormat = function (datetime, formatStr) { var dat = datetime; var str ...

  3. shell 流程控制语句

    case语句 case $变量名 in "值1")   如果变量的值等于值1,则执行程序1 ;;  "值2")   如果变量的值等于值2,则执行程序2 ;;   ...

  4. 这本小书的目的是引导你进入 React 和 Webpack 的世界。他们两个都是非常有用的技术,如果同时使用他们,前端开发会更加有趣。

    https://fakefish.github.io/react-webpack-cookbook/index.html

  5. UVa LA 2965 - Jurassic Remains 中间相遇,状态简化 难度: 2

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  6. JavaScrip(三)JavaScrip变量高级操作(字符串,数组,日期)

    一:字符串 charAt() 返回指定位置的字符 indexof() 返回指定字符串首次出现的位置 replace() 替换指定的字符 concat() 连接两个或多个字符串 substr(start ...

  7. Cracking The Coding Interview 5.6

    //Write a program to swap odd and even bits in an integer with as few instructions as possible (e.g. ...

  8. jdk8-全新时间和日期api

    1.jdk8日期和时间api是线程安全的 1.java.time  处理日期时间 2.java.time.temporal: 时间校正器.获取每个月第一天,周几等等 3.java.time.forma ...

  9. 深入理解java虚拟机---虚拟机工具jconsole(十八)

    Jconsole,Java Monitoring and Management Console. Jconsole是JDK自带的监控工具,在JDK/bin目录下可以找到.它用于连接正在运行的本地或者远 ...

  10. 1076 Wifi密码

    下面是微博上流传的一张照片:“各位亲爱的同学们,鉴于大家有时需要使用 wifi,又怕耽误亲们的学习,现将 wifi 密码设置为下列数学题答案:A-1:B-2:C-3:D-4:请同学们自己作答,每两日一 ...