
不可变
心想才事成
这个作者很懒,什么都没留下…
展开
-
1.4.2 理解使用不可变性的代码
1.4.2 理解使用不可变性的代码 在前面介绍函数式风格的好处时,我们讨论过不可变性(immutability)。我们使用的示例是一个带边框的椭圆,但是代码的具体行为并不清楚。当我们用不可变对象重写了代码以后,它就变得更容易理解。在后面的章节中,我们会回到这个主题并更详细地讨论。此示例的目的是显示在实践中不可变的对象的表现。 再次强调,如果你在此时没能全部掌握,也不要担心。想象一下,我们翻译 2014-07-26 14:52:17 · 883 阅读 · 0 评论 -
7.1.2 C# 中的函数式数据结构
7.1.2 C# 中的函数式数据结构 我们曾经用 C# 实现过几个函数式不可变数据类型,比如 FuncList 或元组。在 C# 中,是通过以特殊方式写类来实现的,最重要的是,所有属性必须是不可变的,这是通过使用只读字段,或者通过声明的属性具有私有的 setter,且只在类的构造函数中设置来实现。在清单 7.3 中,我们使用第一种方法实现似于类清单 7.1 中 Rect 类型的类。翻译 2014-11-24 11:09:12 · 869 阅读 · 0 评论 -
7.1.1.1 处理记录
7.1.1.1 处理记录 我们在本章后面还要用到Rect 类型,有两个简单的函数来处理矩形。第一个函数是缩小矩形,通过从每一条边上减去指定的宽度和高度,第二个函数是把我们的矩形表示形式转换成 System.Drawing 命名空间中的 RectangleF 类。清单 7.2 中是这两个函数。 清单 7.2 处理矩形的函数 (F# Interactive) > open Sy翻译 2014-11-24 09:58:27 · 929 阅读 · 0 评论 -
3.3.2 函数式列表
3.3.2 函数式列表 现在,我们已经适应了递归的一般概念,那么,可以详细地讨论函数式列表了。刚才我们提到过,列表可以为空,也可以由元素与另外的列表组成。因此,需要一个特殊的值来表示空列表,以及构建列表的方法,通过在已有列表的前面加上一个元素。第一个选项(空列表)有时称为 nil,第二个选项产生 cons cell(是构造列表单元的缩写,constructed list cell)。在图翻译 2014-09-24 10:40:24 · 719 阅读 · 0 评论 -
3.2 使用不可变数据结构
3.2 使用不可变数据结构 不可变数据结构(或对象),其值一经产生就不可改变。当声明一个包含一些值的数据结构,这些值存储在插槽(slot)中,比如字段或值的声明。在函数编程中,所有这些插槽都是不可变的,这导致了数据结构的使用也是不可变的。在本节,我们将演示最简单的内置的不可变数据类型,在后面的章节中会看到更常见的函数式数据结构。翻译 2014-09-13 23:17:01 · 923 阅读 · 0 评论 -
3.2.1元组类型(tuple)
3.2.1元组类型(tuple) F# 中最简单的不可变数据结构是元组2类型。元组是一种简单类型,它把几个(可能是)不同类型的值组合在一起。下面的示例创建了一个值,它包含了组合在一起的两个值: > let tp = ("Hello world!",42);; val tp : string * int 创建元组值相当简单:值列表括在括号内,以逗号分隔。我们仔细地看一下代翻译 2014-09-14 10:53:22 · 1291 阅读 · 0 评论 -
2.2.2 使用不可变数据结构
2.2.2 使用不可变数据结构 函数程序表示数据,使用数据结构,我们会在第五、七章讨论数据结构。虽然数据结构的概念通常更简单,但是,我们现在要讨论复合数据类型,比如 C# 值类型,或类。从第一章我们知道,函数编程中的数据结构是不可变的。 不可变数据结构的概念,逻辑上可以从不可变值绑定的概念推导出来。典型的数据结构包含字段声明。如果我们不可变性的概念从变量声明扩展到字段声明,就能得出一切都翻译 2014-08-19 17:42:46 · 1587 阅读 · 0 评论 -
3.2.4 模式匹配元组
3.2.4 模式匹配元组 在前面的示例中,我们是在 let 绑定中用模式匹配分解元组的,清单 3.10 的代码可以稍微改进一下。我们实际上并不使用元组中的第二个元素,因此,只需要把第一个元素指定一个名字。在模式中把第二个值写成下划线,就可以做到,像这样: let (originalItem1, _) = tuple 下划线是一种特殊的模式,能匹配任何表达式,并且忽略赋给它翻译 2014-09-22 17:05:59 · 1137 阅读 · 0 评论 -
2.2.1 使用不可变值
2.2.1 使用不可变值 函数程序第一个常见功能是很少使用典型的变量,这与我们从其他编程语言所了解不同。主要的差别在于,函数语言更喜欢用不可变的变量,即变量值一旦初始化后,就不能改变。因此,再称为“变量”就相当不合适了,函数程序员通常称为“值”。 我们用一个示例来说明,说要写一个取初始值的程序,再从控制台读两个数字,将初始值加上第一个数字,再将结果乘上第二个数字。在 C# 中,通常的做翻译 2014-08-19 09:20:07 · 747 阅读 · 0 评论 -
2.2.3 用递归改变程序状态
2.2.3 用递归改变程序状态 现在,我们来写一此更复杂的函数,看看如何使用值。我们实现的函数,是求指定范围内的数字的和。当然你可以直接计算出和,但我们是把它作为使用循环进行计算的示例。(在 2.3.1 节,我们会把代码改成更通用的函数。) int SumNumbers(int from, int to) { intres = 0; for(int i = from;翻译 2014-08-20 11:14:06 · 853 阅读 · 0 评论 -
2.2 函数程序的计算
2.2 函数程序的计算 在第一章,我们知道了函数程序是使用不可变数据结构,来表示数据的状态的。使一切都不可变的函数式方法,不仅影响到数据结构(在 C# 中称类),而且也扩展到局部变量。 如果你要问,当一切都不可变时,程序还能干什么,我们是不会感到惊讶的。简单的说,函数程序,不是用能够改变状态的语句来表示的,而是用计算表示的。在本节,我们会揭示这种计算方式,但首先看一个使用变量的简单代码。翻译 2014-08-18 13:05:09 · 867 阅读 · 0 评论 -
1.4.3.1 并行化不可变程序
1.4.3.1 并行化不可变程序 首先,让我们再看看清单 1.8,这是两段以函数方式写的游戏代码。在第一段,第二行用到了第一行的结果(运动后怪物的状态)。由于使用了不可变类,它没有给我们任何空间引入并行机制。 第二段代码的两行是独立的。我们刚才说过,用函数式编程,独立的程序部分能够并行。现在,我们发现,不可变性对于找出哪些部分程序是独立的,是一个好方法。即使我们不知道任何细节,也可以看出翻译 2014-07-28 14:55:57 · 949 阅读 · 0 评论 -
1.4.2.1 阅读函数式程序
1.4.2.1 阅读函数式程序 我们在清单 1.1 中看过一个示例,就是使用了不可变类型,我们的结论是,不可变类型使代码更具可读性。在本节,我们将考虑两段代码,可以用在我们函数式游戏中。 清单 1.8 中有两个示例,都涉及两个游戏角色(player 和 monster)。第一个示例说明怪物[1]如何移动一步,然后,判断玩家是否正处于危险之中,第二示例演示如何射击。 Listing翻译 2014-07-26 22:27:08 · 860 阅读 · 0 评论 -
7.2 平面文档的表示
7.2 平面文档的表示 在这一章,我们将要开发一个用于显示文档的应用程序。首先设计文档的表示形式,适合于绘制在屏幕上。使用这种表示方式,文档就是元素的列表,其中包含一定内容(可以是文本,也可以是图像),和指定的边框,在边框中绘制具体内容。图7.1是一个文档的示例,有三个突出显示的元素。 我们看一下用 F# 表示文档的数据结构。清单 7.4 引入了新的表示两种类型元素的差别联合,和新的表示翻译 2014-11-24 15:41:34 · 973 阅读 · 0 评论