博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
什么是函数式编程
阅读量:2059 次
发布时间:2019-04-29

本文共 2394 字,大约阅读时间需要 7 分钟。

一、什么是函数式编程(FP)

(1) 函数式编程:

它属于”结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。

函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。

【补充:Lambda演算是通过一个函数来解决这个问题,而这个函数又是由一系列别的函数组成,这样递归下去,最终达到常量。有些类似动态规划那种一个问题由多个子问题组成,子问题又有自己的子问题,最后到达一些已知解的问题。】

二、特性

闭包和高阶函数、

惰性计算
递归

三、5个特点

①函数是”第一等公民”

指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值
②只用”表达式”,不用”语句”
③没有”副作用”
指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。因为 FP 语言不包含任何赋值语句,变量值一旦被指派就永远不会改变。
④不修改状态
函数式编程只是返回新的值,不修改系统变量。因此,不修改变量,也是它的一个重要特点
⑤引用透明性
即如果提供同样的输入,那么函数总是返回同样的结果。就是说,表达式的值不依赖于可以改变值的全局状态。

四、特点与缺点

1.优点

代码简洁,开发快速;

接近自然语言,易于理解;
方便的代码管理(有利于进行单元测试(unit testing)和除错(debugging),以及模块化组合)
易于”并发编程”
代码的热升级

2.缺点

函数式编程常被认为严重耗费在CPU和存储器资源。

例如: 由于所有的数据都是不可变的,所以所有的变量在程序运行期间都是一直存在的,非常占用运行资源。同时由于函数式的先天性设计导致性能一直不够。虽然现代的函数式编程语言使用了很多技巧比如惰性计算等来优化运行速度,但是始终无法与面向对象的程序相比,当然面向对象程序的速度也不够快。


常见问题总结

1.编程范式

编程语言主要有三种类型[3]:

命令式编程(Imperative Programming): 专注于”如何去做”,这样不管”做什么”,都会按照你的命令去做。解决某一问题的具体算法实现。

函数式编程(Functional Programming):把运算过程尽量写成一系列嵌套的函数调用。
逻辑式编程(Logical Programming):它设定答案须符合的规则来解决问题,而非设定步骤来解决问题。过程是事实+规则=结果。

函数式编程

相比于命令式编程关心解决问题的步骤,函数式编程是面向数学的抽象,关心数据(代数结构)之间的映射关系。函数式编程将计算描述为一种表达式求值。

在狭义上,函数式编程意味着没有可变变量,赋值,循环和其他的命令式控制结构。即,纯函数式编程语言。

  • Pure Lisp, XSLT, XPath, XQuery, FP
  • Haskell (without I/O Monad or UnsafPerformIO)

在广义上,函数式编程意味着专注于函数

  • Lisp, Scheme, Racket, Clojure
  • SML, Ocaml, F#
  • Haskell (full language)
  • Scala
  • Smalltalk, Ruby

2.scala中方法与函数的区别

当然在现在很多(非纯)函数式编程语言中也有方法和函数的区别。比如scala[1]:scala> def m(x:Int) = 2*x   //定义一个方法m: (x: Int)Intscala> m    //方法不能作为最终表达式出现
:9: error: missing arguments for method m;follow this method with '_' if you want to treat it as a partially applied function m ^ scala> val f = (x:Int) => 2*x //定义一个函数f: Int => Int =
scala> f //函数可以作为最终表达式出现res9: Int => Int =

方法就是命令式编程中的函数,而函数则是函数式编程中的函数。

3.变量与表达式

纯函数式编程语言中的变量也不是命令式编程语言中的变量(存储状态的内存单元),而是数学代数中的变量,即一个值的名称。

变量的值是不可变的(immutable),也就是说不允许像命令式编程语言中那样能够多次给一个变量赋值。比如说在命令式编程语言我们写x = x + 1。

函数式语言中的条件语句,循环语句等也不是命令式编程语言中的控制语句,而是一种表达式。

  • “表达式”(expression)是一个单纯的运算过程,总是有返回值;
  • “语句”(statement)是执行某种操作(更多的是逻辑语句。),没有返回值。
    函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。比如在Scala语言中,if else不是语句而是三元运算符,是有返回值的。

严格意义上的函数式编程意味着不使用可变的变量,赋值,循环和其他命令式控制结构进行编程。 当然,很多所谓的函数式编程语言并没有严格遵循这一类的准则,只有某些纯函数式编程语言,如Haskell等才是完完全全地依照这种准则设计的。


函数式编程的特性:

  • 高阶函数(Higher-order function)
  • 偏应用函数(Partially Applied Functions)
  • 柯里化(Currying)
  • 闭包(Closure)
    具体解释参见“”

转载地址:http://yrvlf.baihongyu.com/

你可能感兴趣的文章
Linux find 文件查询 用法示例
查看>>
Linux 查看文件大小
查看>>
mysql 命令
查看>>
MySQL执行外部sql脚本文件的命令
查看>>
解决MySql Error Code: 2006
查看>>
查看mysql数据库和表所占用空间
查看>>
Guava Collections使用介绍
查看>>
Ordering犀利的比较器
查看>>
spring+Mybatis+Ehcache整合
查看>>
google guava使用例子/示范(一)
查看>>
joda-time 时间API
查看>>
Joda Time API -2
查看>>
Spring使用Cache、整合Ehcache
查看>>
Chrome调试工具奇淫技
查看>>
30分钟快速掌握Bootstrap
查看>>
如何针对业务做DB优化
查看>>
程序猿都该知道的MySQL秘籍
查看>>
Eclipse全面提速小技巧
查看>>
前端程序员必知的30个Chrome扩展
查看>>
memcached分布式实现原理
查看>>