函数组合
函数组合可以让我们把多个函数组合形成一个新的函数,在执行时可以把参数输入给第一个执行的函数(从右到左去执行),当此函数执行完成后会返回一个中间结果,并把中间结果给下一个函数来处理,当最后一个函数执行完成时会返回最终的结果。
函数组合要满足结合律(两两加括号不改变结果)。
可以在组合时加入trace函数来跟踪结果,打印数据。
多参数函数组合需要用函数的柯里化:函数优先,数据随后。
pointfree风格:一个参数为函数的函数返回各参数函数的组合从而返回能解决特定复杂问题的函数。
函子:可以把函子想象成一个盒子,盒子里保存一个值,然后通过调用盒子里的map方法,可以传入一个函数,通过这个函数可以对盒子里的值进行处理。
函数式编程随堂测试
共6道,答对5题
100
总分120分
1. 多选题[多选题]下面关于函数式编程的说法错误的是(20分)
- A函数式编程是一种编程范式,跟面向对象编程是并列关系
- B函数式编程可以很大程度上让代码可以重用
- C函数式编程可以很大程度上提高程序的性能
- D函数式编程中的函数是程序中的函数或者方法
回答正确 +20分
答案解析
解析:C 选项函数式编程不能提高程序的性能,因为大量使用闭包在某种程度上会降低性能(占用内存)D 函数式编程中的函数不是程序中的函数或者方法,而是数学中的函数
2. 多选题[多选题]函数是一等公民包含(20分)
- A函数可以存储在变量中
- B函数可以作为参数
- C函数可以作为返回值
- D函数可以递归调用
回答正确 +20分
答案解析
MDN 中关于头等函数(函数是一等公民)的解释只包含前三点
3. 单选题[单选题]下面关于纯函数的说法错误的是(20分)
- A纯函数对于相同的输入永远会得到相同的输出
- B纯函数中的函数指的是数学中的函数
- C副作用会让一个函数变的不纯
- D可以通过某种方式避免副作用的发生
回答正确 +20分
答案解析
副作用会让一个函数变的不纯,副作用不可能避免,因为代码难免会依赖外部的配置文件、数据库等,只能最大程度上控制副作用在可控的范围内发生
4. 多选题[多选题]于柯里化的描述正确的是(20分)
- A柯里化函数 curry,也是高阶函数
- B柯里化函数 curry 内部用到了闭包,对函数的参数做了“缓存”
- C柯里化可以把多个参数的函数转换成只有一个参数的函数,通过组合产生功能更强大的函数
- D柯里化让函数变的更灵活,让函数的粒度更小
回答正确 +20分
5. 多选题[多选题]关于函数组合说法正确的是(20分)
- A函数可以看做一个处理数据的管道,管道中输入参数 x,在管道中对数据处理后得到结果 y
- B通过函数组合可以把多个一元函数组合成一个功能更强大的函数
- C函数组合需要满足结合律
- D函数组合默认的执行顺序是从右到左
回答正确 +20分
6. 多选题[多选题]关于函子的说法正确的是(20分)
- A函子是一个特殊的容器(对象),这个容器内部封装一个值,通过 map 传递一个函数对值进行处理
- BMayBe 函子的作用是处理外部的空值情况,防止空值的异常
- CIO 函子内部封装的值是一个函数,把不纯的操作封装到这个函数,不纯的操作交给调用者处理
- DMonad 函子内部封装的值是一个函数(这个函数返回函子),目的是通过 join 方法避免函子嵌套
D 选项 回答错误, 正确答案为 ABC
答案解析
Monad 函子是解决函子嵌套的问题,并不是避免函子嵌套