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

  首先,什么是函数式编程,这并没有唯一定义,它只是广泛聚合了一些编程风格的特性,我们可以将它与面向对象编程OOP进行对比, 两者区别是,OOP主要聚焦于数据的区别,而FP则注重数据结构的一致性。

面向对象:

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

函数编程:

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

  那么OOP和FP在业务领域是否有胜者呢? 我们大部分业务逻辑是这样写:

SELECT orders.order_id, orders.order_date, suppliers.supplier_name
  FROM suppliers
  RIGHT OUTER JOIN orders
  ON suppliers.supplier_id = orders.supplier_id
  WHERE orders.order_status = 'INCOMPLETE'
  ORDER BY orders.order_date DESC;

  SQL是非常类似FP,它能渗透到业务中,它使用一致的数据结构(数据表结构Schema),一些基本函数能组合成很多查询语句,它是declarative声明式的, 也就是说,写出的SQL是告诉数据库我需要什么,数据库就为你返回,而不必指定数据库如何具体去查询。

  声明式编程和命令式编程区别? FP的主要特点是它们描述它们要"什么",而不是如何实现。而OO在其方法中,还是使用大部分命令式技术。 下面是命令式技术代码:

var sumOfSquares = function(list) {
  var result = 0;
  for (var i = 0; i < list.length; i++) {
    result += square(list[i]);
  }
  return result;
};

console.log(sumOfSquares([2, 3, 5]));

函数编程代码如下:
var sumOfSquares = pipe(map(square), reduce(add, 0));
console.log(sumOfSquares([2, 3, 5]));

  函数风格的编程特点:

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

  如果说OOP还有很多人可能受静态数据思路影响,那么FP 带来完全是动态事件,FP让我们直接用动词思考,用方法函数解决问题,比如两个帐号之间的转帐,按照DDD等静态领域建模思维,转帐这个功能是放在帐号这个实体类中,还是做一个服务呢?在OOP语言中,我们实现功能总是使用服务Service这样一个概念替代,而且强调无态服务,无态服务实际就是一个只有方法函数没有属性的空架子“类”而已。 2007年的Adam Heroku一篇博文中写道:银行账户之间转帐的老式做法是使用数据库事务,这种做法比较刚性,正确做法是将转帐事件存储起来,如果你是一个面向函数范式的思维者觉得这样做就很正常。---来自" NOSQL存储的基于事件的事务实现 " 。

  有很多人将FP归结于数学思维,实际上这只看到其表面,没有看到数学语言这个背后的形式逻辑,编程语言作为和数学同等形式语言,他们的核心基础都是分析哲学的形式逻辑,过去的面向对象很多设计原则也来源于形式逻辑,见:蒯因与引用透明 。  

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

面向函数范式编程(Functional programming)的更多相关文章

  1. 关于函数式编程(Functional Programming)

    初学函数式编程,相信很多程序员兄弟们对于这个名字熟悉又陌生.函数,对于程序员来说并不陌生,编程对于程序员来说也并不陌生,但是函数式编程语言(Functional Programming languag ...

  2. Java 中的函数式编程(Functional Programming):Lambda 初识

    Java 8 发布带来的一个主要特性就是对函数式编程的支持. 而 Lambda 表达式就是一个新的并且很重要的一个概念. 它提供了一个简单并且很简洁的编码方式. 首先从几个简单的 Lambda 表达式 ...

  3. 函数式编程 - Functional Programming

    什么是函数式编程 函数式编程是一种编程范式. 编程范式又是什么? 编程范式是一种解决问题的思路. 命令式编程 把程序看作 一系列改变状态的指令: 函数式编程 把程序看作 一系列数学函数映射的组合. i ...

  4. 用R实现范式编程

    面向函数范式编程(Functional programming) 模拟简单的随机过程 模拟一个简单的随机过程:从N~(0,1)标准正态分布中产生100个随机值,反复5次得到一个list,再以每个lis ...

  5. Sth about 函数式编程(Functional Programming)

    今天开会提到了函数式编程,针对不同类型的百年城方式,查阅了一部分资料,展示如下: 编程语言一直到近代,从汇编到C到Java,都是站在计算机的角度,考虑CPU的运行模式和运行效率,以求通过设计一个高效的 ...

  6. iOS 开发之函数式编程思想(Functional Programming)

    函数式编程(Functional Programming), 函数式编程强调的函数:1.不依赖外部状态:2.不改变外部状态. 函数式编程可解决线程安全问题,每一个函数都是线程安全的. 时间状态:变量一 ...

  7. Coursera公开课Functional Programming Principles in Scala习题解答:Week 2

    引言 OK.时间非常快又过去了一周.第一周有五一假期所以感觉时间绰绰有余,这周中间没有假期仅仅能靠晚上加周末的时间来消化,事实上还是有点紧张呢! 后来发现每堂课的视频还有相应的课件(Slide).字幕 ...

  8. GO语言的进阶之路-面向过程式编程

    GO语言的进阶之路-面向过程式编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们在用Golang写一个小程序的时候,未免会在多个地方调用同一块代码,这个时候如何优化你的代码呢 ...

  9. 第二章 Getting started with functional programming

    Getting started with functional programming 开始函数式编程 higher-order functions-高阶函数 所有FP语言的主要特点是函数可以像普通值 ...

随机推荐

  1. Django 学习笔记之四 QuerySet常用方法

    QuerySet是一个可遍历结构,它本质上是一个给定的模型的对象列表,是有序的. 1.建立模型: 2.数据文件(test.txt) 3.文件数据入库(默认的sqlite3) 入库之前执行 数据库同步命 ...

  2. Sublime text 取消记住上一次打开的,这功能太墨迹了!

    比较恨,这sublime text的配置全部都是配置文件. 选择菜单:Preferences->Settings-User,增加配置项 //热退出,其实实现一种模拟没有退出的状态,当程序再次启动 ...

  3. 使用HQL语句的按照参数名字查询数据库信息的时候 “=:”和参数之间不能存在空格,否则会报错

    问题描述: 今天在使用HQL的按照参数的名字查询数据库信息的时候报错如下: org.hibernate.QueryException: Space is not allowed after param ...

  4. (转)CentOS5.5 下搭建 PHP 环境(最佳的LAMP环境)

    本文详细阐述在 Linux 系统中搭建 PHP 环境,由于 PHP 就是由 C 语言编写的,最初也是运行在 Linux 系统中,所以Linux 是 PHP 的最佳环境. 关于本文中使用到的软件,请点击 ...

  5. EXCEL,熟悉又不熟悉的项目管理工具

    EXCEL,熟悉又不熟悉的项目管理工具 如何利用excel做轻量级的项目管理 教你用Excel进行项目管理

  6. SDUT2482二叉排序树

    http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2482&cid=1184 题目描述 二叉排序树的定义是:或者是一棵空树,或者是具有下列性质 ...

  7. 用supervisor控制celery时的脚本

    注意启停的先后顺序及判断即可. 这样,在更改task之后,要重启就方便很多啦.. #!/bin/sh supervisord_count=`ps -elf | grep celery | grep - ...

  8. 2013 Multi-University Training Contest 2 Balls Rearrangement

    先算出lcm(a,b),如果lcm>=n,则直接暴力解决:否则分段,求出0-lcm内的+0-n%lcm内的值. 再就是连续相同的一起计算!! #include<iostream> # ...

  9. spring中的aware接口

    1.实现了相应的aware接口,这个类就获取了相应的资源. 2.spring中有很多aware接口,包括applicationContextAware接口,和BeanNameAware接口. 实现了这 ...

  10. 天气API整理,返回的数据格式为json对象

    中国天气的API惨遭封杀,不得已更换其他的API使用吧. 这里大部分API来自APP的数据包截取或者反汇编,所以各开发使用者不得用于商业用途,否则后果自负! 1.金山网址导航 来源:http://ww ...