Functional programming
纯的函数式编程functional
lisp 、haskell、Erlang、Scheme
有函数式编程思想,对函数式编程提供了部分支持的语言
Scala、Python、R
原因:适合并行运算-多核计算-云计算-模式匹配
函数式编程概念
First-class Function
所有运算都是表达式expression
不需要变量,没有副作用
纯函数---Pure Function Side effects 副作用
引用透明--Referential Transparency
不变性--Immutability
递归函数--Recursive Function Tail recurisive 尾递归
惰性求值--lazy evaluation
Curried Function-- 柯里化函数
Anonymous functions 匿名函数
Partial Function 偏函数
Higher order function: 高阶函数:能够接受函数作为参数的函数
Closures 闭包,内层函数引用了外层函数的变量(参数也算变量),
然后返回内层函数的情况,称为闭包(Closure)。
闭包的特点是返回的函数还引用了外层函数的局部变量,
要正确使用闭包,就要确保引用的局部变量在函数返回后不能变
Scala函数式编程
不是纯函数式编程-- var val lazy val
会自动进行数据类型推导-- Any--AnyVal AnyRef
函数字面量<function literal>--值函数不能指定返回值类型
匿名函数
(形参列表) => {函数体}
闭包: 函数和上下文
高阶函数:map() reduce() filter() flatMap() fold()
Python与函数式编程
不是纯函数式编程:允许有变量
支持高阶函数:函数可以作为变量传入:map() reduce() filter()
支持闭包: 返回函数
有限度的支持匿名函数:例如lambda x: x * x,关键字lambda表示匿名函数,冒号前面的x表示函数参数。
python匿名函数有个限制,就是只能有一个表达式
装饰器:decorator----- 接收一个函数--包装--返回一个新的函数===通过高阶函数返回新函数 @ 语法
decorator 本质上就是一个高阶函数,
它接收一个函数作为参数,然后,返回一个新函数。
使用 decorator 用Python提供的 @ 语法,
这样可以避免手动编写 f = decorate(f) 这样的代码
decorator还改变了函数的__doc__等其它属性
不想改变,就需要把原函数的一些属性复制到新函数中functools:
R 语言与函数式编程
闭包:环境
高阶函数:Reduce()、Filter()、Map() Postion()
apply lapply sapply tapply mapply eapply rapply
匿名函数 R 语言没有创建命名函数的特殊语法
Java与函数式
函数式编程-和-数据处理
输入数据流
迭代操作<外部迭代和内部迭代>---->递归
操作: 筛选 切片 映射
查找 匹配 规约 数据分组和分区
并行数据处理--顺序流转化为并行流
模式匹配
终端操作