1、假设有一个函数,要求你传入一个文件路径,然后向你展示该文件的内容。你会认为它是一个纯函数吗?
不会。该函数不满足纯函数的特征,它可能会因为文件内容的变化、文件被删除等情况,即使传入相同的文件路径,也不一定返回相同的输出;并且它读取文件属于与外部环境交互,会产生副作用,所以不是纯函数。
2、当无法避免使用不纯函数时,应该怎么做?
可以尝试将“纯”和“不纯”的部分分离,例如隔离 I/O 操作。
还可以尽量避免副作用以提高代码的可维护性,比如在重构代码时,先尝试减少业务逻辑层的副作用。
3、C#支持头等函数。这意味着什么?
这意味着可以像使用其他类型一样使用函数,例如:
- 将函数赋值给变量
- 将其作为参数传递给另一个函数
- 将其用作返回类型
- 也可以将它们存储在数据结构中
4、你能编写一个将函数用作返回类型的程序吗?
可以,以下是示例程序:
using static System.Console;
static Func<int, int> GetSquareFunction()
{
Func<int, int> squareFunction = x => x * x;
return squareFunction;
//return x => x * x;
}
WriteLine("Exercise 1.5 ");
int a = 10;
var square = GetSquareFunction();
WriteLine($"The square of {a} is: {square(a)}");
在上述程序中, GetSquareFunction 函数不接受任何参数,但返回一个 Func<int, int> 类型的函数。
5、纯函数可以依赖于不纯函数。这一说法是否正确?
是的,不纯的 I/O 函数可以使用从纯函数获得的结果,说明纯函数可以为不纯函数提供依赖,也就是纯函数可以被不纯函数依赖,故该说法正确。
6、一个不纯函数可以调用一个纯函数。这是真的吗?
是的,不纯函数可以使用从纯函数获得的结果,所以可以调用纯函数。
7、函数式编程(FP)与面向对象编程(OOP)有何不同?
-
编程风格
- OOP遵循命令式编码风格,即指示计算机“先做这个,再做那个”,也称为算法编程
- FP遵循声明式编码风格 -
状态变化跟踪
- 在命令式方法中,跟踪状态变化至关重要
- 在函数式方法中不存在这一需求 -
基本构建块
- 在命令式编码风格中,类或结构体是基本构建块
- 在函数式方法中,函数被视为一等公民,非常重要
此外:
- OO通过封装可变动部分使代码易于理解
- FP通过最小化可变动部分使代码易于理解
8、函数式编程(FP)的特点有哪些?
函数式编程(FP)具有以下特点:将函数视为一等公民;偏好不可变性;偏好纯函数;遵循声明式编程。
9、函数式编程(FP)有哪些好处?
FP对程序员有一些重要好处,包括:
- 促进编写更简短、更简洁且可读性高的代码
- 倾向于使用易于管理和测试的纯函数
- 在多线程环境中可编写更好的代码,避免丢失更新和死锁等传统问题,能编写无锁代码
- 有助于编写独立代码段,便于引入并行性
- 提供新的开发视角,可与其他范式(如OOP)结合开发更好的应用程序
10、你能编写一个使用具有以下类型参数的高阶函数(HOF)的程序吗?参数类型为 Action 。
可以,示例程序如下:
using static System.Console;
WriteLine("Using a HOF that has an Action<int,int> parameter.");
int a = 10, b = 5;
Action<int, int> add = (x, y) => WriteLine($"{x}+{y}={x + y}");
DisplayTotal(add, a, b);
static void DisplayTotal(Action<int, int> del, int a, int b)
{
del(a, b);
}
该程序的输出为:
Using a HOF that has an Action<int, int> parameter.
10+5=15

最低0.47元/天 解锁文章
1130

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



