在最近的学习中,不断听到看到函数式编程,据说常见的编程范式有命令式编程、函数式编程、逻辑式编程等,而常见的面向对象编程居然是一种命令式编程。对于函数式编程来说,其只关心、定义输入数据和输出数据相关的关系,也就是映射。函数式编程关心数据的映射,命令式编程关心解决问题的步骤。
函数式编程概念
定义
函数式编程 - Functional Programming
,一种编程范式,也就是如何编写程序的方法论。它属于『结构化编程』的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。
特性
- 闭包和高阶函数。
- 惰性计算。
- 递归。
- 函数是『第一等公民』:函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。
- 只用『表达式』,不用『语句』
- 没有『副作用』:函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。
- 不修改状态:函数不维护任何状态,只返回新的值,不修改系统变量。
- 引用透明性:如果提供同样的输入,那么函数总是返回同样的结果。
优点
- 代码简洁,开发快速。
- 接近自然语言,易于理解。
- 更方便的代码管理。
- 易于『并发编程』。
- 代码的热升级。
函数式编程实例
实例一
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| <?php
function map(callable $fn)
{
return function ($args) use ($fn) {
foreach ($args as $key => $val) {
yield $key => $fn($val);
}
};
}
$a = function ($value) {
return $value * 2;
};
$b = function ($value) {
return ucwords($value);
};
$result1 = iterator_to_array(map($a)([1, 2, 3, 4]));
$result2 = iterator_to_array(map($b)(['php', 'java', 'python']));
var_dump($result1, $result2);
// 结果
array(4) {
[0]=>
int(2)
[1]=>
int(4)
[2]=>
int(6)
[3]=>
int(8)
}
array(3) {
[0]=>
string(3) "Php"
[1]=>
string(4) "Java"
[2]=>
string(6) "Python"
}
|
实例二
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| <?php
function filter(callable $fn)
{
return function ($args) use ($fn) {
foreach ($args as $key => $val) {
if ($fn($val)) {
yield $key => $val;
}
}
};
}
$a = function ($value) {
return $value % 2 > 0;
};
$b = function ($value) {
return ord($value) > 97;
};
$result1 = iterator_to_array(filter($a)([1, 2, 3, 4, 5]));
$result2 = iterator_to_array(filter($b)(['a', 'b', 'c', 'd', 'e']));
var_dump($result1, $result2);
// 结果
array(3) {
[0]=>
int(1)
[2]=>
int(3)
[4]=>
int(5)
}
array(4) {
[1]=>
string(1) "b"
[2]=>
string(1) "c"
[3]=>
string(1) "d"
[4]=>
string(1) "e"
}
|
实例三
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| <?php
function reduce(callable $fn)
{
return function ($args) use ($fn) {
$accumulator = 0;
foreach ($args as $value) {
$accumulator = $fn($accumulator, $value);
}
return $accumulator;
};
}
$a = function ($a, $b) {
return $a + $b;
};
$b = function ($a, $b) {
return sqrt($a) + sqrt($b);
};
$result1 = reduce($a)([1, 2, 3, 4, 5]);
$result2 = round(reduce($b)([1, 2, 3, 4, 5]), 2);
var_dump($result1, $result2);
// 结果
int(15)
float(4.19)
|