函数式编程
概念
一种编程范式,属于「结构化编程」的一种。强调执行的==结果==而不是执行的过程
- 语言支持举例
- 支持良好:swift、JavaScript、Python
- 支持不好:C/C++(C++11以前)、Obj-C(引入 block 以前)、JAVA(8以前)
- 举个栗子
//过程式
var a = 0
func incrementUnfunctional() -> () {
a += 1
}
incrementUnfunctional()
print(a) // a = 1
//函数式
var a = 0
func incrementFunctional(num: Int) -> Int {
return num + 1
}
a = incrementFunctional(a)
print(a) // a = 1
- 特点
函数是第一等公民(Frist Class), 支持闭包或者其他值捕获写法
var print = function(i) { console.log(i); }; [1, 2, 3].forEach(print)- 使用「表达式」而不是「语句」
- 表达式:有返回值的一个单纯运算过程
- 语句:执行操作,没有返回值
- 没有副作用,即函数不产生运算以外的其他结果
不修改状态
function reverse(string) { if (string.length == 0) { return string; } else { return reverse(string.substring(1, string.length)) + string.substring(0, 1); } } var str = "Hello, world!"; console.log(reverse(str)); // !dllow, olleh console.log(str); // Hello, world!- 引用透明,即可再现性
- 优点
减少代码冗余
接近自然语言
subtract(multiply(add(1, 2), 2), 4); add(1, 2).multiply(3).subtract(4); merge([1, 2], [3, 4]).sort().search("2")方便测试和查错
易于并发编程
var s1 = op1(); var s2 = op2()l var s3 = concat(s1, s2); //函数式编程要求保证 op1 不修改变量或系统状态,即 op2 可能用到的状态不会被 op1 修改
三个常用函数
- filter()
用途:[x~1~, x~2~, …, x~n~] -> if (f(x~n~) == true -> [f(x~n1~), f(x~n2~), …]
参数:1.一个集合 2. 一个函数
操作步骤:
- 生成一个空集合
- 对集合中的每个元素执行函数
- 返回值为 true -> 放进新集合,否则丢弃
- 返回新的集合
//swift
var arr = [10, 20, 45, 32, 100]
var filteredArray = arr.filter({(money: Int) -> Bool in
return money > 30
})
print(filteredArray)
//JavaScript
var filteredArray = arr.filter(function (m) {
return m > 30
})
console.log(filteredArray)
- map() / flatmap()
用途:[x~1~, x~2~,… x~n~] -> [f(x~1~), f(x~2~), … f(x~n~)]
参数:1. 一个集合 2. 一个函数
操作步骤:
- 生成一个空集合
- 用函数处理传入集合中的每一个元素,依次插入新集合
- 返回新的集合
//swift
var mappedArray = arr.map{ money in return "\(money)¥"}
print(mappedArray)
func sqr(x: Int) -> Int{
return x * x
}
let squares = [0, 1, 2, 3, 4].map(sqr)
print(squares) // [0, 1, 4, 9, 16]
//JavaScript
var mappedArray = arr.map(function (m) {
return m + "$"
})
console.log(mappedArray)
- reduce()
用途:[x~1~, x~2~, … x~n~] -> [f(f…f(f(x~1~, x~2~), x~3~)…, x~n-1~), x~n~)]
参数:1. 一个集合 2. 一个函数(JS 中最多接受四个参数)3.一个初值(JS 中可不写)
操作步骤:(假设集合中有 m 个元素,函数 f 接受 n 个参数,返回一个 Int,初值为0)
- 集合中的前 n-1 个元素和 0 作为参数执行函数 f,获得返回值 r1
- 集合中的第 1~n 个元素和 r1 作为参数执行函数 f,获得返回值 r2
- …
- 集合中的第 m-n+1 个元素和 r~n-1~ 作为参数执行函数 f,获得返回值 r
- r 就是 reduce 方法的返回值
//swift
let sum = [10, 20, 45, 32, 100].reduce(0) { $0 + $1 }
print(sum)
//JavaScript
var reducedArray = [10, 20, 45, 32, 100].reduce(function (m1, m2) {
return m1 + m2
})
console.log(reducedArray)
1225

被折叠的 条评论
为什么被折叠?



