1. 能使用函数式编程的语言有什么特点?FP 全称是什么?
- 函数和其他数据类型一样的地位,
①可以赋值给其他变量、②也可以作为函数参数、③函数返回值
- FP:
Functional Programming
函数式编程
图中两个地址是比较好的学习资料
2. 实现 ((num + 3) * 5 - 1) % 10 / 2
功能,用传统函数做法会怎么做?体验一下
传统实现
3. FP - 柯里化 Currying (版本一)
- 首先,我们把上面的函数,封装成每次只传递一个参数的函数
柯里化
- 虽然我们对函数进行柯里化,保证每个函数只有一个参数,但是
嵌套调用
,让代码的可读性依然很差 - 这时候就需要引入函数合成的概念
4. FP - 函数合成 (版本二)
- 目的:我们需要将两个函数合成一个函数
合成函数
-
好像经过我们这样转换后,还是
函数嵌套调用
,完全看不到好处啊4. FP - 重载运算符,变变变(版本三)
这一步:也可以叫做将
合成函数
变成中缀运算符
image.png
-
这次代码就舒服多了,就像
流水一般
经过一个个函数处理 num4. FP - 重载运算符,优化(版本四)
我们这个合成函数缺陷比较明显,只能接受 Int 类型,思考如何改造呢?
-
我们先进行如下类型分析
类型 -
最终版:
获得函数合成的最终版
5. 什么是高阶函数(Higher-Order Function)?和 FP 有什么关系?
image.png
6. 什么是柯里化(Currying)?Array 和 Optional 的 map 方法接收的参数是一个柯里化函数吗?
image.png
7. 实践:如何将下面三个参数的函数进行柯里化?
// 思考如何把下面函数进行柯里化?
func add(_ v1: Int, _ v2: Int, _ v3: Int) -> Int {
v1 + v2 + v3
}
image.png
总结: 柯里化每次仅接收一个参数,当到达最后一个参数时,才会进行最终的计算。
8. 我们可以写一个通用函数,替两个参数的函数
进行自动柯里化
吗?
- 可以
image.png
9. 自动柯里化
与 合并函数
的结合使用
image.png
10. 对三个参数的函数,进行自动柯里化
image.png
11. 什么是函子(Functor)?为什么 Array 和 Optional 是函子?(了解)
image.png
image.png
image.png
12. 什么是适用函子(Applicative Functor)?(了解)
image.png
13. 什么是单子(Monad)?(了解)
image.png