
列表
文章平均质量分 68
心想才事成
这个作者很懒,什么都没留下…
展开
-
11.4.2 在照片浏览器中缓存值
11.4.2 在照片浏览器中缓存值 在下一个示例中,我们要写一个应用程序,找出指定文件夹中的所有照片,并显示为一个列表。当用户选择一张照片,应用程序调整它的大小,并显示在一个窗口中。(为了简便起见,我们不会允许用户调整窗口大小)。当我们画了这张照片时,需要调整其大小以适合屏幕,然后,显示调整大小后的图像。 很明显,我们不想在应用程序启动时调整所有照片的大小:对于翻译 2011-11-03 16:15:45 · 840 阅读 · 0 评论 -
3.4.1 处理数字列表
3.4.1 处理数字列表假设我们想写一个类似于 SumList 的方法,但是把加法改成乘法。这个修改看起来很简单:可以复制 SumList 方法,然后进行修改。其中只有两个变化:int MultiplyList(FuncList numbers) { if (numbers.IsEmpty) return 1; [1] else return number翻译 2014-09-28 16:20:37 · 1027 阅读 · 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.5.3.1 散函数应用(PARTIAL FUNCTION APPLICATION)
5.5.3.1 散函数应用(PARTIALFUNCTION APPLICATION) 要展示对函数的这种新理解情况,非常重要,让我们把注意力返回到列表。假设有一个数字列表,我们想要给列表中的每个数字都加上 10。在 F# 中,可使用 List.map 函数完成;在 C# 中,可以使用 LINQ 中的 Select 方法: list.Select(n => n + 10) ß C#翻译 2014-10-24 20:08:03 · 798 阅读 · 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 评论 -
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 评论 -
6.7 处理列表
6.7 处理列表 在第三章,我们讨论过列表,学习了显式使用递归和模式匹配处理列表,还用 C# 实现了函数式列表类型;第 4 章的示例应用程序就以这种方式使用列表,但是要注意,显式写列表处理并不实用。在这一章,将用到递归模式,因此,你可能已经知道我们下一步要讨论什么了。我们可以使用高阶函数来处理列表,而不必显式使用模式匹配的每种情况;我们已经看到过一些处理 F# 列表的函数,比如 Lis翻译 2014-11-18 14:09:06 · 774 阅读 · 0 评论 -
6.7.1 用F# 实现列表
6.7.1 用F# 实现列表 虽然我们已经使用过 F# 中的列表,还用 C# 实现了相同的功能,但还没有研究如何用F# 实现列表类型。当我们前面讨论列表时,看到列表既可以表示为空值(nil)(空列表),也可以表示包含元素和引用列表其余部分的 cons cell。现在,如果我们回顾上一章中有关值的内容,这就像是有两个选项的可选值;微有一点稍不同,列表类型是递归的,因此,cons cell翻译 2014-11-18 14:48:45 · 945 阅读 · 0 评论 -
6.7.2 理解列表函数的类型签名
6.7.2 理解列表函数的类型签名 前面提到过,我们使用函数来筛选和映射列表,都很直观。在本节,我们将看到它们的类型签名,知道只通过此信息,就可以推断出高阶函数能做什么。当然,在一般情况下,不能从函数的类型就知道它能做什么,但对于泛型和高阶函数,例如那些用来处理列表的函数,通常是可能的。如我们前面所见的,处理泛型值的函数所做的不如单独处理值,因为,不能知道值的所有消息,因此,它们通常要翻译 2014-11-18 15:43:59 · 1380 阅读 · 0 评论 -
6.7.3 实现列表函数
6.7.3 实现列表函数 刚才我们看到的筛选和映射函数,没有展示如何实现,现在,我们要看一个在第三章开始创建的函数。因为所有的列表处理函数都有类似的结构,看过下面的示例以后,实现其他任何函数也是可能的。在第三章,我们写的函数,能够计算列表中的所有元素的和或积;随后,我们就意识到它可能比开始所表现的更有用:我们看到,它还能用来查找最小或最大元素。那时,我们没有讨论过泛型,因此,函数只处理翻译 2014-11-19 14:42:06 · 843 阅读 · 0 评论 -
6.3.1 处理计划列表
6.3.1 处理计划列表 在前面的示例中,因为我们想要打印新的计划,因此,使用了命令式的 for 循环;如果想要创建包含新的计划列表,可以使用 List.map 函数,就像这样: let newSchedules = List.map(fun s –> s |> mapSchedule (fun d -> d.AddDays(7.0)) )schedul翻译 2014-10-31 10:31:57 · 705 阅读 · 0 评论 -
6.7.2.1 处理列表
6.7.2.1 处理列表 我们看一个有关使用筛选和映射更大的示例,在 F# 库中的两个函数适用于各种集合类型,但我们将只用它来处理我们已经很熟悉的列表;在 C# 中,这些方法可用于任何实现了 IEnumerable 接口的集合,所以,我们将使用泛型 .NET List 类。清单 6.21 显示了我们将要处理数据的初始化。 清单 6.21 有关城市人口的数据 (C# and F#)翻译 2014-11-19 11:02:48 · 893 阅读 · 0 评论 -
6.7.3.1 在 C# 中实现 fold
6.7.3.1 在 C# 中实现 fold与 fold 有相同行为的操作,在 .NET 库中也有,但是,名字叫Aggregate(聚合)。通常,它是能够在任何集合类型上运行的扩展方法,我们也可以像 F# 函数一样使用它。清单 6.21 是我们用 C# 3.0 重写前面示例的代码。在 F# 中,我们用元组来保存在聚合过程中的状态。你也许还记得以前的几章中,我们曾提到过,C# 3.0 中的翻译 2014-11-19 15:46:12 · 1187 阅读 · 0 评论 -
6.8.1 映射、筛选和折叠(Mapping, filtering, and folding)
6.8.1 映射、筛选和折叠(Mapping,filtering, and folding) 映射、筛选和折叠是函数编程中最常见的操作;在处理函数式列表时,我们已经用到过,但它们还支持所有其他的集合类型(我们将在第十和十二章讨论其中一部分);这些操作并不限于集合,所有的操作都可用于处理选项类型。清单 6.25 显示了映射、筛选和折叠函数的签名类型,清单中包括了我们尚未讨论过的Optio翻译 2014-11-20 10:30:12 · 919 阅读 · 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.4.1 用 C# 求列表中数字的和
3.3.4 处理函数式列表 到目前为止,我们已经讨论了函数式列表类型的外部特征,以及如何用 C# 实现,现在是时候写一些实际的代码,用函数式列表干睦什么了。例如,用 C# 实现方法 SumList(或 F # 中的 sumList 函数),对列表中的数求和。 3.3.4.1 用 C# 求列表中数字的和 只要使用 C# 命令式编程,并处理过标准的 .NET 数组或来自 Sys翻译 2014-09-25 16:21:37 · 1810 阅读 · 0 评论 -
11.4.1 无穷列表
11.4.1 无穷列表 这一节的标题可能听起来有点奇怪(或疯了),所以,我们会提供一个字面解释。我们用得很多的数据结构之一是函数式列表。我们也可能想要表示逻辑上无穷列表,例如,所有质数的列表。事实上,我们不会使用所有的数字,但可能会处理这样的数据结构,而不考虑长度。如果列表是无穷的,我们就能够访问我们需要尽可能多的数字。 除了数学上的挑战,同样的概念在许多主流编翻译 2011-11-02 21:35:55 · 648 阅读 · 0 评论 -
6.7.1 F# 中实现列表
6.7.1 F# 中实现列表 虽然我们已经处理过 F# 中的列表,还在 C# 中实现了相同功能,但还没有探索在 F# 中如何实现列表类型。当我们前面讨论列表时,看到列表既可以表示为零(nil)值(空列表),也可以表示成 cons cell,包含一个元素和对列表中的其余部分的引用。 现在,如果我们看看上一章中的值的图库,这与带有两个选项的可选值完全一样。有一点稍微不同, 列翻译 2011-05-19 09:30:00 · 494 阅读 · 0 评论 -
6.7 处理列表
6.7 处理列表 在第 3 章,我们讨论过列表,学会了如何显式使用递归和模式匹配来处理列表。还在 C# 中实现了一个函数式列表类型。在第 4 章的示例应用程序中,以这种方式,使用列表,但是要注意,显式写列表处理并不是很实用的。 这是这一章用到递归模式,因此,你可能已经知道我们下一步要说什么了。在每种情况下,不显式使用模式匹配,我们可以使用高阶函数来处理列表。我们已经看到一翻译 2011-05-19 09:23:00 · 398 阅读 · 0 评论 -
6.3 处理计划
6.3 处理计划 在本节中,我们将把上一节的技术应用到可选为值。在处理元组时,我们发现写函数,有助于处理元组中的一个元素。同样,处理可选值时,需要高阶函数,在一个或多个可选值上执行某种操作。我们接着上一章的示例,我们从计划类型开始,然后,看一下选项类型。 在前面的章节中,我们实施了一个类型,表示事件的计划。在 F# 中,它是叫 Schedule(计划)的差别联合,可以包含翻译 2011-05-10 16:00:00 · 401 阅读 · 0 评论 -
6.3.1 处理计划列表
6.3.1 处理计划列表 在前面的示例中,我们使用了一个命令式的 for 循环,因为,我们想要打印新的计划。如果想要创建一个列表,包含新的计划,可以使用 List.map 函数,写成这样: let newSchedules = List.map (fun s –> s |> mapSchedule (fun d -> d.AddDays(7.0))翻译 2011-05-11 09:12:00 · 464 阅读 · 0 评论 -
8.1.4 在 F# 中使用函数列表
8.1.4 在 F# 中使用函数列表 首先,我们声明一个表示有关客户信息的类型。客户端有相当多属性,所以,最自然的表示将是 F# 的记录类型,我们在前一章中已经看过。清单 8.4 显示了这个类型声明,和所创建的示例客户的代码。 Listing 8.4 Client record type and sample value (F# Interactive) > typ翻译 2011-06-21 14:46:00 · 549 阅读 · 0 评论 -
筛选列表中的值
筛选列表中的值// 取出 [[("XX",1);("XX",2)];[...]] 中的 XX// [["XX";"XX"];[...]] let t1 = [[("XX",1);("XX",2)]]t1 |> List.map (List.map (fun (a, b) -> a)) // [["XX"; "XX"]]l原创 2013-01-20 20:09:14 · 580 阅读 · 0 评论 -
从数字列表中,任意三个相加为指定值的所有组合
从数字列表中,任意三个相加为指定值的所有组合let rec subsets s = set [ yield s for e in s do yield! subsets (Set.remove e s)] |> Set.toListsubsets (set [1..5])subsets (s原创 2013-02-05 16:44:59 · 3555 阅读 · 0 评论 -
使用 F# 列表
使用 F# 列表 在 C# 中使用 F# 的列表,是完全可能的,但是,我建议不要用,因为,只要再做一点,就会使事情在 C# 看来更加自然。例如,把列表转换成数组很简单,用List.toArray 函数;转换成System.Collections.Generic.List,用 new ResizeArray()构造函数;转换成System.Collections.Generic.IEnume翻译 2014-06-22 17:56:15 · 1171 阅读 · 0 评论 -
3.3.2 函数式列表
3.3.2 函数式列表现在,我们已经适应了递归的一般概念,那么,可以详细地讨论函数式列表了。刚才我们提到过,列表可以为空,也可以由元素与另外的列表组成。因此,需要一个特殊的值来表示空列表,以及构建列表的方法,通过在已有列表的前面加上一个元素。第一个选项(空列表)有时称为 nil,第二个选项产生 cons cell(是构造列表单元的缩写,constructed list cell)。在图翻译 2014-09-24 10:40:24 · 719 阅读 · 0 评论 -
3.3.2.1 用模式匹配分解列表
3.3.2.1 用模式匹配分解列表 在 3.2.4 节,我们讨论有关元组的匹配模式时,看到两种不同的使用方法。一种方法是直接在 let 绑定中写出模式,即可以把表达式的结果分配给值,也可以在函数参数的声明中;另一种方法是使用 match 关键字。两者的重要区别在于,使用 match 可以指定多个模式,有多个分支。处理列表,我们需要使用第二种方法,因为在列表处理时,每次都要指定两个不同的分支翻译 2014-09-24 16:17:19 · 822 阅读 · 0 评论 -
3.3.4 处理函数式列表
3.3.4 处理函数式列表 到目前为止,我们已经讨论了函数式列表类型的外部特征,以及如何用 C# 实现,现在是时候写一些实际的代码,用函数式列表干睦什么了。例如,用 C# 实现方法 SumList(或 F # 中的 sumList 函数),对列表中的数求和。翻译 2014-09-25 14:40:52 · 720 阅读 · 0 评论 -
3.3.3 C# 中的函数式列表
3.3.3 C# 中的函数式列表 要了解函数式列表类型的工作原理,最好的办法是看看如何用 C# 实现同样的功能。有几种方法来表达列表可能为空,或者有头和尾。面向对象的解决方案可能是写一个抽象类 FuncList,它有两个派生类,比如,EmptyList 和 ConsCellList,分别表示种情况。为使代码尽可能简单,我们只使用一个类,有一个属性 IsEmpty,它会告诉我们这个实例是否包翻译 2014-09-25 09:37:19 · 799 阅读 · 0 评论 -
7.2.1 绘制元素
7.2.1 绘制元素如同在第四章画饼图时那样,我们将使用标准 .NET 的 System.Drawin 库。这个示例演示使用前一节的表示方法,绘图极其简单,清单 7.6 中的函数核心只有几行代码,遍历列表中的所有元素,包含了绘制两种不同元素的代码。清单 7.6 绘制使用平面表示的文档 (F# Interactive)> let drawElements elem翻译 2014-11-24 16:13:10 · 852 阅读 · 0 评论