[scala]函数式编程思想入门

1.python闭包的栗子

def make_adder(addend):
    def adder(augend):
        return augend + addend
    return adder

p = make_adder(23)
q = make_adder(44)

print p(100)
print q(100)
这里比较特殊的就是make_adder是一个函数,而该函数由定义了一个新的函数,并且在新的函数内使用了外层函数中的参数addend。

关于闭包,专业的名词解释是:闭包(CLosure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。

实际上,闭包是起函数作用,并能相操作对象一样操作的对象。


2.函数式编程思想

定义:简单说,“函数式编程”是一种编程范式,也就是如何编写程序的方法论。它属于“结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用
函数式编程的主要几个思想:
1)函数是“第一等公民”

所谓“第一等公民”,指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。

举栗如下:

var print = function(i){ console.log(i);};   //定义一个函数
  
[1,2,3].forEach(print);        //将函数作为变量

2)只用“表达式”,不用“语句”

表达式是一个单纯的运算过程,总是有返回值;而语句是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。原因是函数是编程的开发动机,一是为了处理运算,不考虑系统的读写(I/O)。


3)没有“副作用”

所谓"副作用"(side effect),指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。 函数式编程强调没有"副作用",意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。
3.函数式编程的好处

1)代码简洁,开发迅速:函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。

2)接近自然语言,易于理解:栗子-----表达式(1 + 2) * 3 - 4,可以写成函数式语言:subtract(multiply(add(1,2), 3), 4)

3)更方便的代码管理:函数式编程不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。因此,每一个函数都可以被看做独立单元,很有利于进行单元测试(unit testing)和除错(debugging),以及模块化组合。

4)易于“并发编程”:函数式编程不需要考虑"死锁"(deadlock),因为它不修改变量,所以根本不存在"锁"线程的问题。不必担心一个线程的数据,被另一个线程修改,所以可以很放心地把工作分摊到多个线程,部署"并发编程"(concurrency)。

栗子:

var s1 = Op1();
var s2 = Op2();
var s3 = concat(s1, s2);

由于s1和s2互不干扰,不会修改变量,谁先执行是无所谓的,所以可以放心地增加线程,把它们分配在两个线程上完成。其他类型的语言就做不到这一点,因为s1可能会修改系统状态,而s2可能会用到这些状态,所以必须保证s2在s1之后运行,自然也就不能部署到其他线程上了。 多核CPU是将来的潮流,所以函数式编程的这个特性非常重要。









你可能感兴趣的:(spark,函数式编程,scala)