函数式编程笔记
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 有两种:
它不能增加或者删除元素(某些程度上是好的)
可以搜索任意元素
比list 快,因为它的数据是不变的,元素的数量有限的(implementation overhead少一些)
可以让runtime 去放弃和最终结果没有关联的分支expressions,把一些的算法的复杂度降低
在加载数据时只加载需要的数据
有时候会增加空间复杂度
以上是关于函数式编程笔记的主要内容,如果未能解决你的问题,请参考以下文章