![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
序列
文章平均质量分 64
心想才事成
这个作者很懒,什么都没留下…
展开
-
12.3 处理序列
12.3 处理序列 处理序列,有多种选项,包括从低级的技术,能控制所有的详细信息,但难表达更复杂而通常的处理模式,到更高级的技术,虽然不能表达我们可能想要的所有,但表达非常优雅。 在 C# 中,最低级别 (除了直接实现 IEnumerable 接口) 是使用迭代器块,读取输入的序列,既可以使用 foreach,也可以使用枚举对象。更高级,我们可以使用预定义(或者翻译 2011-11-13 17:10:33 · 447 阅读 · 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 · 3529 阅读 · 0 评论 -
Seq 处理文件的效率差别怎么会这么大?
Seq 处理文件的效率差别怎么会这么大?(*fsc --standalone --codepage:936 -O --noframework testpseq.fsx*)//#r @"C:\Program Files\FSharpPowerPack-2.0.0.0\bin\FSharp.PowerPack.Parallel.Seq.dll"//ope原创 2012-05-26 15:24:06 · 1014 阅读 · 0 评论 -
把序列合并成字符串
把序列合并成字符串a |> Seq.fold (fun a b -> a + b) ""a |> Seq.reduce (fun a b -> a + b)原创 2012-05-28 19:31:44 · 847 阅读 · 0 评论 -
拆分奇偶数
拆分奇偶数open Systemopen System.IOlet a = seq{1..10}let writeToFile filename obj = using(File.AppendText(filename)) (fun file1 -> file1.WriteLine("{0}", obj.ToString() ) )let e =原创 2012-04-20 14:38:18 · 1771 阅读 · 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 · 527 阅读 · 0 评论 -
12.2.2 无穷序列
12.2.2 无穷序列 在前一章中,我们简单演示了如何使用延迟值实现延迟列表。这种数据结构可以用来创建无穷数据结构,比如,从零开始的整数列表。这是可能的,因为每个元素的计算被推迟了:只当我们访问元素时,才计算它的值,并且,每次只关注一个元素的计算。 使用 seq 表示序列是相似的。该接口有一个方法 MoveNext,关注下一个计算的元素。序列可能是无窜的,就是说翻译 2011-11-13 16:23:56 · 731 阅读 · 0 评论 -
12.3.1 用迭代器转换序列
12.3.1 用迭代器转换序列 到目前为止,我们只能用迭代器,来从单一的数据块(如果任何)生成序列。然而,迭代器的一个常见用途,是以某种方式把一个序列变换成另一个。作为一个简单的例子,这里有一个方法,取一个数字的序列,返回平方序列:IEnumerable Squares(IEnumerable numbers) { foreach(int i in nu翻译 2011-11-13 21:10:27 · 595 阅读 · 0 评论 -
12.3.2 筛选和映射
12.3.2 筛选和映射 筛选和映射是两个最常用的序列处理运算符。在第 6 章,我们用它们处理过 F# 的函数式列表,和在 C# 中的泛型 .NET List 类型。LINQ 库的 Where 和 Select 扩展方法已经可以处理序列,在 F# 中,我们可以使用两个来自 Seq 模块 (即 Seq.map 和 Seq.filter)的函数来达到相同的效果。 使用高阶函数翻译 2011-11-15 11:12:36 · 592 阅读 · 0 评论 -
12.1 生成序列
12.1 生成序列 有几种生成序列的技术,我们来看一下我们的选项。直接的方法是实现 IEnumerator 接口,提供 Current 属性和 MoveNext 方法,它将枚举数对象移动到下一个元素。这迫使我们显式创建有可变状态的对象,这很明显违反了函数式的风格。通常,我们可以应用隐藏可变异的技术,给我们更加声明式表达生成序列的内容。这类似于在前一章中使用的延迟值。显式使用翻译 2011-11-04 20:44:05 · 594 阅读 · 0 评论 -
12 第十二章 序列表达式和选择工作流
12 第十二章 序列表达式和选择工作流本章介绍■ 生成和处理序列值■ 处理 F# 序列表达式■ 理解单子和 LINQ 表达式■ 实现 F# 计算表达式 在我们开始讨论序列表达式之前,必须知道什么是序列(sequence)。这是另一个来自于数学的 F# 术语,序列是排序的列表,它可能包含无穷的元素。不用担心这一切听上去有点抽象,我翻译 2011-11-04 18:43:55 · 750 阅读 · 0 评论 -
12.4.2 自定义 F# 语言
12.4.2 自定义 F# 语言 至止,我们所讨论过的序列表达式,都是用 seq 标识符表示,后面的代码块括在大括号中。然而,F# 允许创建我们自己的标识符,给代码块以特殊意义。通常,这个功能称为计算表达式(computation expressions),序列表达式是它的一个特例,它是由 F# 核心实现,并由编译器优化的。 我们已经看到过,计算表达式可以包含标准翻译 2011-11-16 17:15:02 · 663 阅读 · 0 评论 -
12.4.1 自定义查询表达式
12.4.1 自定义查询表达式 原则上,我们可以使用查询处理任何支持绑定操作的类型。这是用于函数式编程中的标准名称,像上一节中所示的类型签名的函数。从技术角度讲,我们需要实现可以由 C# 编译器所使用的方法,把查询表达式转换为标准的函数调用。我们将为 12.6 节中的 Option 的类型实现这些方法。该类型没有实现 IEnumerable,所以,标准查询运算符不能使用。翻译 2011-11-16 11:20:38 · 838 阅读 · 0 评论 -
12.4 可选工作流(alternative workflows)
12.4 可选工作流(alternative workflows) 计算表达式(Computation expressions)是一种 F# 功能,部分灵感是来自 Haskell 的单子(monads)。单子有个不好的名声,对于脑 bustingly 有困难的人来说,但是,也不用担心。我们将看一下如何实现一套有趣的技术,可以在 C# 中很好地处理 Option 值。还将看到如何翻译 2011-11-16 09:43:56 · 658 阅读 · 0 评论 -
12.3.3 平面映射(flattening projection)
12.3.3 平面映射(flattening projection) 平面映射,可以为来自源集合的每个元素的元素生成一个序列,合并所有返回的序列。我们很快就会看到,这是一个基本操作,可以用来定义其他处理操作,包括映射和筛选。有关平面映射唯一的事情就是,为每个输入元素生成多个输出元素。注意 在 LINQ 库中,这个操作被称为 SelectM翻译 2011-11-15 21:32:58 · 911 阅读 · 0 评论 -
把序列合并成字符串
把序列合并成字符串let a1 = seq ["aa";"bb"];;let a2 = seq ["aa"];;let a3 = Seq.empty;; reduce 对于空序列就不容易处理了。let b1 = a1 |> Seq.reduce(fun a b -> a + "," + b);;let b2 = a2 |> Seq.reduce(fun a原创 2012-07-28 15:21:45 · 1663 阅读 · 0 评论