函数式编程, Functional Programming
Contents
函数式编程, Functional Programming
函数式编程已经存在了很长了时间,早在50年代 Lisp 编程语言的介绍中就有提过。如果你有关注近两年里内热门的 Clojure,Scala,Erlang,Haskell,Elixir 等语言的话,其中都有函数式编程的概念。
函数式编程的简要历史 正如我们所说的,早在50年代函数式编程开始之前,Lisp 语言就已经在 IBM 700/7000 系列的科学计算机上运行了。Lisp 引入了很多与我们现在的函数式编程有关的示例与功能,我们甚至可以称 Lisp 是所有函数式编程语言的鼻祖。
这也是函数式编程中最有趣的方面,所有函数式编程语言都是基于相同的 λ演算,这种简单数学基础。
λ演算是图灵完备的,它是一种通用的计算模型,可用于模拟任何一台单带图灵机。它名字中的希腊字母 lambda (λ),被使用在了 lambda 表达式和 lambda 项绑定函数中的变量中。
λ演算是一个极其简单但又十分强大的概念。它的核心主要有两个概念:
函数的抽象,通过引入变量来归纳得出表达式; 函数的应用,通过给变量赋值来对已得出的表达式进行计算;
什么是函数式编程 什么是函数式编程?它是一种编程范式,即一切都是数学函数。函数式编程语言里也可以有对象,但通常这些对象都是恒定不变的 —— 要么是函数参数,要什么是函数返回值。函数式编程语言里没有 for/next 循环,因为这些逻辑意味着有状态的改变。相替代的是,这种循环逻辑在函数式编程语言里是通过递归、把函数当成参数传递的方式实现的。
函数式编程单看上面的理论无疑是无法理解的,所以,需要通过它的一些特点来感受什么是函数式编程
函数是"第一等公民” 所谓"第一等公民” (first class),指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。 举例来说,下面代码中的print变量就是一个函数,可以作为另一个函数的参数。
只用"表达式”,不用"语句” “表达式” (expression)是一个单纯的运算过程,总是有返回值;“语句” (statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。
原因是函数式编程的开发动机,一开始就是为了处理运算 (computation),不考虑系统的读写 (I/O)。“语句"属于对系统的读写操作,所以就被排斥在外。
当然,实际应用中,不做I/O是不可能的。因此,编程过程中,函数式编程只要求把I/O限制到最小,不要有不必要的读写行为,保持计算过程的单纯性。
没有"副作用” 所谓"副作用” (side effect),指的是函数内部与外部互动 (最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。
函数式编程强调没有"副作用”,意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值.
不修改状态 上一点已经提到,函数式编程只是返回新的值,不修改系统变量。因此,不修改变量,也是它的一个重要特点。
在其他类型的语言中,变量往往用来保存"状态” (state)。不修改变量,意味着状态不能保存在变量中。函数式编程使用参数保存状态,最好的例子就是递归。
引用透明 引用透明 (Referential transparency),指的是函数的运行不依赖于外部变量或"状态”,只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的。
OO (object oriented,面向对象)是抽象数据,FP (functional programming,函数式编程)是抽象行为。 在java中,函数式编程是通过lambda表达式实现的。
lambada表达式 基本表达形式如下:
Runnable noArguments = () -> System.out.println(“Hello World”); Lambda 表达式的基本语法是:
参数。 (可以有多个) 接着 ->,可视为“产出”。 -> 之后的内容都是方法体。 当只用一个参数,可以不需要括号()。 然而,这是一个特例。 正常情况使用括号()包裹参数。 为了保持一致性,也可以使用括号()包裹单个参数,虽然这种情况并不常见。 如果没有参数,则必须使用括号()表示空参数列表。 对于多个参数,将参数列表放在括号()中。 方法体的语句超过一句时,需要使用{},并根据情况看是否需要return Lambda 表达式产生函数,而不是类。 在 JVM (Java Virtual Machine,Java 虚拟机)上,一切都是一个类,因此在幕后执行各种操作使 Lambda 看起来像函数 – 但作为程序员,你可以高兴地假装它们“只是函数”。
https://segmentfault.com/a/1190000021030581 https://github.com/jasonGeng88/blog https://github.com/jasonGeng88/blog/blob/master/201705/functional_programming.md https://www.ruanyifeng.com/blog/2012/04/functional_programming.html https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/
Author -
LastMod 2011-08-28