函数式编程语言(functional language)
什么是函数式编程语言
函数式编程(英语:functional programming)或称函数程序设计,又称泛函编程,是一种编程典范,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(引数)和输出(传出值)。
比起指令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而不是设计一个复杂的执行过程。
函数式编程语言的特征
命令式编程语言是以冯诺依曼这种体系结构为模型,而函数式程序语言的目的是尽可能的模拟数学函数。
函数式语言的核心特征:
(1)以“函数”为首,如同命令式语言中的“变量”,函数可以赋值给其他变量,可以作为其他函数的参数,或者作为其他函数的返回值。
(2)不修改变量的值
(3)只有表达式,没有语句。此处的语句指的是没有返回值得某些操作。
(4)引用透明(Referential transparency),函数的运行不依赖与外部变量或“状态”,简单的说就是,同一个输入(参数),总是会产生同一个输出(返回值),这与数学函数的特征很一致。命令式语言因为全局变量等的存在,就无法做到这一点。
(5)对比命令式语言,递归形式的循环
为什么函数式编程语言开始流行
1.代码简洁、开发快速
函数式代码同命令式相比代码量要少很多,一行顶十行,所以实现一些功能也比较简洁,作为开发者的我们,还是对代码更亲切一些,来看一个具体例子,从中体会其特点。
功能描述:统计文本或网页中单词的频率TF(term frequency),词频在计算网页质量、信息检索中是一个重要概念。
2.易于理解,抽象度高
3.没有副作用,变量无状态
如果一个函数内外有依赖于外部变量或者环境时,常常我们称之为其有副作用,如果我们仅通过函数签名不打开内部代码检查并不能知道该函数在干什么,作为一个独立函数我们期望有明确的输入和输出,副作用是bug的发源地,作为程序员开发者应尽量少的开发有副作用的函数或方法,副作用也使得方法通用性下降不适合扩展和可重用性。
函数式编程语言强烈要求使用者编写没有副作用的函数,它的函数式数学意义上的函数,给定一个输入就会有一个输出,而且每次相同的输入输出也肯定一样,函数式中的变量所代表的意义并不是内存中的一块存储单元,因此多个函数同时操作一个变量或者一个函数调用多次一个变量都不会改变该变量的值,函数每次对于给定的输入都是作为一个新值来处理,就是因为它这种没有状态、没有副作用的理念,很适合大数据计算和处理,它只接受固定输入既可以得到预定计算结果,完全不依赖于外部环境。
典型的函数式编程语言
纯函数式编程语言
-
强静态类型
-
Concurrent Clean
-
Haskell
-
Miranda
-
弱类型
-
Lazy K
非纯函数式编程语言
-
强静态类型
-
F#
-
ML
-
OCaml
-
Scala
-
强动态类型
-
Erlang
-
LISP
-
LOGO
-
Scheme
-
Clojure
-
Mathematica
-
R
-
弱类型
-
Unlambda
其他函数式编程语言
-
APL
-
XSLT