函数式编程笔记

Posted 编程食堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数式编程笔记相关的知识,希望对你有一定的参考价值。

关键词

  • higher-order function

  • lazy evaluation

  • declarative programming model 

  • monadic effects

函数式编程的类型

函数式编程语言有两种,pure 和 impure的, pure指的就是这种函数式编程语言只支持函数式编程,比如:Haskell。而LISP这种也支持 imperative style 的是impure的。


函数式编程的特征

  • 使用conditional expression 和 recursion 来计算

  • 支持higher-order functions 和 lazy evaluation

  • 不支持一般的 flow control 比如 if/else 和 loop, switch 等

  • 和面向对象编程一样,函数式编程支持 abstraction, encapsulation, inheritance, polymorphism 等。


函数式编程的优势

没有bug的代码:因为函数式编程不支持state, 使用过程就像没有痕迹一样,所以没有无法预判的副作用

有效的并行编程:因为没有可以改的state,你不会有state 不小心变了的改变的问题,你写出来的代码会更加容易读和测试

效率: 函数式编程写出来的代码是由不同的小单元组成的,他们可以并发地运行,这种程序通常是有效率的。

嵌套函数:函数式编程支持嵌套函数

惰性计算: 真正需要执行的时候才计算表达式, 避免不必要的计算,带来性能上的提升


函数式编程的劣势

比起其他语言,需要更多的内存来运行。

因为没有state,每次都要创建新的object来做事情。


函数式编程是用来干嘛的,啥时候用

函数式编程通常在我们需要对同样的数据进行各种不同操作时使用。

比如 AI 的开发, 机器学习,自然语言处理等。


和OOP的对比

      

什么是higher order function?

HOP有以下其中一个特性:

  • 有一个或多个function作为argument 传进去。

  • 返回function 作为结果

python例子

def twice(function):  return lambda x: function(function(x)) def f(x):  return x + 3 g = twice(f)print g(7) ## -> 13 在twice里面叫了function两次


什么是polymorphism?

同一操作/接口作用于不同的对象/数据类型,有不同的解释,从而产生不同的执行结果。

polymorphism 有两种:

compile-time polymorphism / static polymorphism  - function overloading 就是同样名字的函数有不同数量的参数,或者不同类型的参数, 因为传进去的参数不一样,compile知道叫哪个function
run-time polymorphism / dynamic polymorphism  - function overriding, virtutal functions 就是 父类和子类有同样的函数(同样的参数数量和类型),然后这个子类相当于override了父类的函数,这个run-time 又run-time enviroment来判断

是什么是Tuple?
 tuple是一个组合的数据类型,它里面的内容是在创建的时候就决定的,它可以存任意类型,数量的元素,创建之后之后就不能改变了。
tuple的优势 (其实也没啥优势):
  • 它不能增加或者删除元素(某些程度上是好的)

  • 可以搜索任意元素

  • 比list 快,因为它的数据是不变的,元素的数量有限的(implementation overhead少一些)


是什么是Lambda calculus?
我学得似懂非懂,然后看不出有什么用,想学的看这个链接:
https://www.jianshu.com/p/ebae04e1e47c

是什么是Lazy Evaluation?
"no computation should be performed until its result is actually required"
不运行expression 直到我们需要它 算出来的值。

可以让runtime 去放弃和最终结果没有关联的分支expressions,把一些的算法的复杂度降低

在加载数据时只加载需要的数据

有时候会增加空间复杂度



以上是关于函数式编程笔记的主要内容,如果未能解决你的问题,请参考以下文章

函数式编程

Java8笔记十一(函数式编程)

函数式编程/命令式编程

Scala笔记整理:函数式编程

Python实用笔记 (15)函数式编程——装饰器

《On Java 8》中文版 第十三章 函数式编程