
模式匹配
文章平均质量分 77
心想才事成
这个作者很懒,什么都没留下…
展开
-
6.4 处理选项类型
6.4 处理选项类型 F# 中,最重要的可选值之一就是选项(option)类型。回顾一下我们的在前面的章节中看到,它给了我们一种安全的方法来表示值可能会缺失的事实。此安全性意味着,我们不能轻松地写代码,可能假定值是存在的,也可能当这个选项类型表示缺失值时,将失败。相反,我们必须使用模式匹配,为这两种情况而写代码。在这一节中,我们将学习两个有用的函数,处理选项类型。 注意翻译 2011-05-11 16:17:00 · 457 阅读 · 0 评论 -
5.3.2.2 用 C# 模拟差别联合
5.3.2.2 用 C# 模拟差别联合 接下来,我们要看一下同样的功能用 C# 如何实现。我们早先已经提到所有相关的类,因此,假设它们已经实现,因此,只看使用的代码。在本章的后面,我们将讨论另一个有关可选值的示例,包括完整的 C# 实现,因此,将会看到如何写 C# 类层次结构,具有与 F# 差别联合相同的属性。 提示 如果想要查看这个示例完整的源代码,包括类声明,可以从本书翻译 2014-10-21 16:10:19 · 755 阅读 · 0 评论 -
5.3.2.1 用 F# 匹配差别联合
5.3.2.1 用 F# 匹配差别联合 当使用差别联合时,必须要处理所有可能的选项,因为,我们不知道这个值到底表示哪一个选项。回忆一下以前类似的情况,处理列表时,问题要检查列表是否为空,我们是使用模式匹配实现的:match 构造能够根据几种模式检查值。我们可以用同样的功能,处理差别联合,只是这里模式换成了识别器。清单 5.5 是获取计划事件下一次发生时间的示例。 清单 5.5 计算翻译 2014-10-21 14:17:16 · 762 阅读 · 0 评论 -
7.3.1 转换表示
7.3.1 转换表示 在我们实现数的据类型之间,存在两个关键的不同:[两个不同,怎么出现三项]1、在新的表示形式中,文件是一个(递归)值,而在第一种情况下,是元素的列表。2、第 7.2 节的数据类型显式包含边框,指定内容的位置。3、第二个数据类型,只表示各部分是如何嵌套的。因此,当我们进行表示形式的转换时,需要计算每个嵌套部分的位置。这些差异影响转换函数的签名,在我翻译 2014-11-25 17:34:14 · 849 阅读 · 0 评论 -
6.4 处理选项类型
6.4 处理选项类型 F# 中,最重要的可选值之一就是选项(option)类型。回顾一下我们在前面的章节中所看到的,选项类型能够安全地表达可能会缺失的值。这种安全性使我们在写代码时,不能轻易地假定值是存在的,当选项类型表示的值缺失时,将失败;相反,我们必须使用模式匹配,写代码要包含两种情况。在这一节,我们将学习处理选项类型两个有用的函数。 注意 我们刚才看到的处理元组的函数翻译 2014-10-31 15:46:01 · 881 阅读 · 0 评论 -
6.6.2 自动泛型化(automatic generalization)
6.6.2 自动泛型化(automatic generalization) 在这一章,我们已经实现了几个 F# 的高阶函数,也看到了在 F# 和 C# 中并排的实现。F# 实现的很重要方面,是我们根本不需要指定类型;这是由于有了自动泛型化(automatic generalization),它用在推断函数声明的类型。我们将用Option.bind 函数的实现作为示例,介绍这个过程是如何工作翻译 2014-11-18 11:20:06 · 907 阅读 · 0 评论 -
4.4.2.3 用函数绘图
4.4.2.3 用函数绘图 DrawStep 函数的第一个参数是两个绘图函数中的一个,我们暂时先给这个绘图函数的类型命名为 DrawingFunc,以后再定义。在讨论其余的参数之前,我们先看一下这个函数的签名: drawStep : (DrawingFunc * Graphics * float* (string * int) list) -> unit 我们再次使用元组语翻译 2014-10-15 11:34:07 · 915 阅读 · 0 评论 -
4.3 创建控制台应用程序
4.3 创建控制台应用程序 为我们的应用程序写一个简单的、基于控制台的输出,是一个良好的开始,因为这做起来相对容易,并且很快能看到结果。我们在本节将使用的几项技术,在稍后的图形版本中也很重要;即使应用程序不需要基于控制台的输出,仍可以把它作为起点,到后来把它改编成更高级的图形化版本。在这一章,我们就要这样做。在上一节,我们已经完成了大部分程序,通过编写通用的泛函数,控制台和图形化版本都翻译 2014-10-12 09:12:50 · 1065 阅读 · 0 评论 -
4.2.2 计算数据
4.2.2 计算数据 在这个应用程序的第一个版本中,我们将只打印标签,以及图表中每一项所占比例(百分比)。要计算百分比,就需要知道列表中所有项目数值总和,这个值用清单 4.4 中的函数 calculateSum 来计算。 清单 4.4 计算列表中的数值和 (F# Interactive)> let rec calculateSum(rows) = matchrows翻译 2014-10-11 09:49:28 · 822 阅读 · 0 评论 -
4.2.1 加载和解析数据
4.2.1 加载和解析数据 作为第一步,我们将实现一个函数 convertDataRow,从 CSV 文件中取一行作为字符串,把这一行拆成两部分,以元组形式返回。函数实现后,就可以立即进行测试,输入一个样本(字符串"Test reading,1234”),应该能够正确解析。清单 4.2 是函数的代码和测试结果。 清单 4.2 解析 CSV 文件的一行 (F# Interactive翻译 2014-10-09 17:20:39 · 750 阅读 · 0 评论 -
3.4.1.2 在 F# 中传递函数作为参数值
3.4.1.2 在 F# 中传递函数作为参数值 在 F# 中的函数 aggregateList 非常类似于我们已经实现的方法,但有一点重要的区别,F# 天然支持把函数作为参数值传递给其他函数,因此,不需要使用委托。在 F# 中,函数是特殊类型。类似于元组,函数的类型是由其他的基本类型构成。元组类型的代码表示,在元素的类型之间使用星号(例如,int * string);而函数的类型表示,翻译 2014-09-29 09:53:56 · 1055 阅读 · 0 评论 -
5.4.1 在 C# 中实现选项类型
5.4.1 在 C# 中实现选项类型 正如我们所看到的,在函数式编程中,选项(option)类型非常重要,我们也希望能够在 C# 中进行函数风格编程,因此,需要在C# 中实现适当的选项类型。我们已经讨论过如何用面向对象语言实现差别联合,这里代码的结构类似于我们前面讨论过的Schedule 类型。在Option 中,我们可以创建一个类(或值类型),有 HasValue 属性,虽然有点简单,但翻译 2014-10-22 15:51:41 · 1332 阅读 · 0 评论 -
3.3.4.2用 F# 求列表中数字的和
3.3.4.1 用 C# 求列表中数字的和 只要使用 C# 命令式编程,并处理过标准的 .NET 数组或来自 System.Collections.Generic 的 List 类,[ 写这个程序并不难, ]可能会创建一个变量total,并初始化为零,写一个 for 循环,迭代所有的数字,把每个元素加到 total 上(类似于 total + = list[i]);(或者,可以用 fore翻译 2014-09-28 08:58:42 · 1106 阅读 · 0 评论 -
3.3.3 C# 中的函数式列表
3.3.3 C# 中的函数式列表 要了解函数式列表类型的工作原理,最好的办法是看看如何用 C# 实现同样的功能。有几种方法来表达列表可能为空,或者有头和尾。面向对象的解决方案可能是写一个抽象类 FuncList,它有两个派生类,比如,EmptyList 和 ConsCellList,分别表示种情况。为使代码尽可能简单,我们只使用一个类,有一个属性 IsEmpty,它会告诉我们这个实例是否包翻译 2014-09-25 09:37:19 · 799 阅读 · 0 评论 -
2.4.3 模式匹配(Pattern matching)
2.4.3 模式匹配(Pattern matching) 当使用函数数据类型时,我们知道得更多的是有关将要处理的这种类型的结构,这个属性有一很好的示例,就是差别联合。处理此类型时,我们肯定知道能得到什么类型的值(比如,在我们前面的示例中,它可能是矩形、椭圆或组合形状)。要写处理差别联合的函数,必须指定每种情况下程序应该做什么。这种结构可能在很多方面类似于 C# 中的 switch 语句翻译 2014-09-03 20:35:32 · 2991 阅读 · 0 评论 -
3.3.2.1 用模式匹配分解列表
3.3.2.1 用模式匹配分解列表 在 3.2.4 节,我们讨论有关元组的匹配模式时,看到两种不同的使用方法。一种方法是直接在 let 绑定中写出模式,即可以把表达式的结果分配给值,也可以在函数参数的声明中;另一种方法是使用 match 关键字。两者的重要区别在于,使用 match 可以指定多个模式,有多个分支。处理列表,我们需要使用第二种方法,因为在列表处理时,每次都要指定两个不同的分支翻译 2014-09-24 16:17:19 · 822 阅读 · 0 评论 -
3.2.4 模式匹配元组
3.2.4 模式匹配元组 在前面的示例中,我们是在 let 绑定中用模式匹配分解元组的,清单 3.10 的代码可以稍微改进一下。我们实际上并不使用元组中的第二个元素,因此,只需要把第一个元素指定一个名字。在模式中把第二个值写成下划线,就可以做到,像这样: let (originalItem1, _) = tuple 下划线是一种特殊的模式,能匹配任何表达式,并且忽略赋给它翻译 2014-09-22 17:05:59 · 1137 阅读 · 0 评论 -
3.2.3 计算元组
3.2.3 计算元组 目前为止,我们还只是用这个示例创建和输出元组,现在,我们要对元组进行一些计算。假设去年增加大量的新生人口,我们就要增加居民人数。我们知道,元组类型是不可变的,因此,不可能设置 C# 元组类的属性。在 F# 中,有两个读元组值的函数(fst 和 snd),也没有设置值的函数,情况是类似的。因此,计算必须遵循通常的函数模式,通过复制初始元组返回新的元组,城市名不变,人翻译 2014-09-18 15:16:46 · 1369 阅读 · 0 评论 -
5.3.4 F# 中的选项(option)类型
5.3.4 F# 中的选项(option)类型 我们常常需要表达这样的思想,某些计算可能会返回未定义的值;在 C# 中,通常用返回 null(空值)实现。不幸的是,使用 null 频繁导致错误:写代码,可能会轻易地假定方法不返回空,一旦这个假设不成立,就会看到NullReference 错误。当然,好代码总是在适当的地方检查值是否为空,为应用程序写的单元测试,大量的检查就是验证这种特定情况翻译 2014-10-22 11:30:05 · 1406 阅读 · 0 评论