12.1.3 使用 F# 序列表达式 在 C# 中的迭代器非常方便(comfortable),能够在普通的 C# 方法中写复杂的代码 (实现 IEnumerable<T>/IEnumerator

12.1.3 使用 F# 序列表达式

在 C# 中的迭代器非常方便(comfortable),能够在普通的 C# 方法中写复杂的代码(实现 IEnumerable<T>/IEnumerator<T> 接口的类型)。开发人员写的代码使用标准的C# 功能,比如环,唯一的改变只是我们可以使用一种新的语句,来做一些非标准的事情,这个新语句用 yield return 表示(或者 yield break 表示终止序列),非标准的行为返回序列中下一个元素的值。在以后需要访问序列的时候(最后,计算出逐个元素),使用 MoveNext 方法。在 F# 中的序列表达式与此很相似:使用了相当于
yield return 的结构。

时间: 2024-10-12 18:14:53

12.1.3 使用 F# 序列表达式 在 C# 中的迭代器非常方便(comfortable),能够在普通的 C# 方法中写复杂的代码 (实现 IEnumerable<T>/IEnumerator的相关文章

12.2.1 递归的序列表达式

函数式编程中主要的控制流结构是递归.我们已经在很多例子中,写的普通函数就使用过递归,它能够解决命令式编程中的循环问题,而不需依赖可变状态.当我们想写一个简单的递归函数时,要使用 let rec 关键字,这样,就能函数以递归方式调用自身. 用于组合序列的 yield! 结构,也可以在序列表达式中执行递归调用,所以,我们同样可以使用函数编程的方法,生成序列.清单 12.4 生成所有的小于 1 百万的阶乘数,与清单 12.1 的 C# 示例一样. 清单 12.4 使用序列表达式生成序列数 (F# In

12.3.2.2 使用查询和序列表达式

在 C# 3.0 中,我们可以使用新的查询表达式语法,写有关映射和筛选数据的操作.查询表达式还支持许多其他操作,但我们会只关注映射和筛选,来演示函数技术和 F# 功能. F# 虽然没有专门提供的查询表达式,但是,使用序列表达式,仍可以轻松地写出映射和筛选数据的查询.这是因为序列表达式在 F# 中所有地方都可以使用,而不仅仅是返回序列的函数.清单 12.9 显示了使用 C# 中的查询和 F# 中的序列表达式,实现我们前面的示例. 清单 12.9 在 C# 和 F# 中的筛选和映射序列 C# F#

12.1.3.1 写序列表达式

在 C# 中,当我们实现返回 IEnumerable<T>.IEnumerator<T>,或对应的非泛型方法时,可以自动使用迭代器.F# 序列表达式使用 seq 标识符显式标记,而且不必要使用方法体或函数体.正如其名字所暗示的,序列表达式是表达式的不同类型,我们可以在代码中的任意位置使用.清单 12.2 演示了使用此语法,创建简单的序列. 清单 12.2 介绍序列表达式的语法 (F# Interactive) > let nums = seq { let n = 10   

第十二章 序列表达式和可选工作流

第十二章序列表达式和可选工作流 本章介绍 ■生成和处理序列值 ■处理 F# 序列表达式 ■理解单子和 LINQ 表达式 ■实现 F# 计算表达式 在我们开始讨论序列表达式之前,必须知道什么是序列(sequence),这也是数学的F# 术语.序列是有序的列表,可能包含无穷的元素.这一切听上去有点抽象,但也不用担心,我们已经熟悉这种类型了,在.NET 中表达同样概念的是:IEnumerable<T>. 在.NET 框架中有IEnumerable<T> 类型的主要原因,是它提供一种统一的

12.3.3.1 序列表达式中的平面映射

假设我们有一个关于城市的元组列表,每个元组包含城市的名字和它所在的国家,另外,我们还有一个列表,是用户所选的城市.因此,我们可以这样表示样本数据: let cities = [ ("New York","USA"); ("London", "UK"); ("Cambridge","UK"); ("Cambridge", "USA") ] let e

12.6 实现选项的计算表达式

在 12.4 节,我们用选项值作为示例,介绍了用 LINQ 查询和 F# 计算表达式创建非标准计算的概念,处理选项值的代码,有自定义的值绑定读取实际值,如同标准值.既然我们已经知道如何转换计算表达式,也就知道我们的 Bind 成员会接收值和 lambda 函数.因为我们处理的是选项类型计算表达式,只有当值是 Some(x) 而不是 None 时,我们才打算执行 lambda 表达式:后一种情况,我们可以立即返回 None. 要运行前面的例子,我们需要在 C# 中实现 LINQ 查询运算符,在 F

12.4.2 自定义 F# 语言

到目前为止,我们所讨论过的序列表达式,都是用 seq 标识符表示,后面的代码块括在大括号中.然而,F# 还允许我们创建自己的标识符,给代码块以特殊的意义.通常,这个功能称为计算表达式(computation expressions),而序列表达式是它的一个特例,是由 F#核心所实现,并经编译器优化. 我们已经知道,计算表达式可以包含标准的语言结构,比如 for 循环,还有别的结构,像 yield.在代码块之前的标识符,描述构造的意义,其方式与查询运算符(例如,Select 和 Where 扩展方

12.1.2 在 C# 中使用迭代器

当C# 2.0 最初引入迭代器时,最常见的用途是为了使自己集合的 IEnumerable<T> 接口的实现更简单.在 C# 中使用的编程风格已经有了演变,现在迭代器能与其它函数式结构一起使用,进行各种数据处理操作. 迭代器可以用来生成任意序列.我们先从一个简单的示例开始,生成阶乘小于一百万的序列,并格式化成字符串形式.清单 12.1 显示了完整的源代码. 清单 12.1 用迭代器生成阶乘(C#) static IEnumerable<string>Factorials() { in

[微软]有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小_利用排列组合思路解决_python版

(原题出自微软公司面试题)问题如下:有两个序列a,b,大小都为n,序列元素的值任意整数,无序:要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小.例如:a=[100,99,98,1,2, 3]b=[1, 2, 3, 4,5,40] 题目是看到QQ群友发的,网上也百度了下目前已经有好几种解法了.写了半天有点晕,后面忽然想到中学时候数学里面的排列组合的方法.方法对于较短的list可行,长list组合情况太多,可能耗时太长或溢出. 1 from itertools im