2.2.2 使用不可变的数据结构

现实世界的函数编程:有 F# 和 C# 示例 1-02-02-2

2.2.2 使用不可变的数据结构

    当表示函数程序中的数据时,我们将使用数据结构,我们会在第 5、7 章中讨论数据结构。请记住,我们现在谈论复合数据类型,如 C# 值类型或甚至是一个类,数据结构通常是一个简单的概念。回想一下第 1 章,在函数编程中,这些数据结构是不可变的。

    不可变的数据结构的概念逻辑一来自于不可变值绑定的概念。一个典型的数据结构包含字段声明。如果我们从变量声明的不可变性的概念扩展到字段声明,就得出一切都是不可变的。在 C# 中,使用 readonly 限定符,可以编写不可变类字段,而在 F# 中,在默认情况下,所有数据结构都是不可变的。F# 并不是严格的函数的语言,因此,它允许创建可变类型。

    在这种情况下,你知道如何使用不可变的数据结构,以及如何在 C# 中创建一个不可变的类。一个类的方法或函数处理数据结构,不能修改结构的状态,可以做的唯一的一件事是返回一些东西,处理这个数据结构的所有操作,都返回一个新值作为结果。在 C# 中,string 类型的行为就像这样。如果你编写 str.Substring(0, 5),结果你会得到一个新的字符串值,原始字符串保持不变。

    我们在第 1 章中提到,函数代码常常写成单个表达式,是而不是一系列语句。理解代码的这种不同,使程序更具声明性,所以,使用不可变的数据结构支持这种函数风格的表现。说我们有一个类表示函数的集合,它有一个操作,创建一个空列表,另一个操作,将数字“添加”到这个列表中。因为列表是不可变的,添加元素不能更改原始列表。相反,该操作返回新的列表中包含原始列表的项目和新添加的元素。如果我们想要创建一个列表,并添加它的元素,我们可以编写这样的代码:

var res = ImmutableList.Empty<int>().Add(1).Add(3).Add(5).Add(7);

    为了做同样的事情,在可变的列表中,我们必须创建它,然后通过调用命令式的 Add 方法对其进行修改,修改这个列表。结果,我们要写一个变量声明和四个语句(可能,源代码总数会是五行)。这个示例表明,不可变的数据结构通常有助于编写更简洁的代码。当然,也有方法在命令式语言中可以实现类似的好处,但是,你用函数风格,不需要额外的努力。

    到目前为止,我们已经看到函数语言使用不变的数据结构和不可变的值,而不是可变的变量。你可以想象一下,如何写出一些非常简单的程序,而无需使用传统的变量和赋值运算符。但是,一旦开始思考更复杂的问题,事情会变得困难,直到你改变看待世界的方法。在下一节中,我们会看看如何以函数风格编码更为复杂的计算。

你可能感兴趣的:(职场,F#,C#,休闲,函数编程)