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

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

本章介绍

■生成和处理序列值

■处理 F# 序列表达式

■理解单子和 LINQ 表达式

■实现 F# 计算表达式

在我们开始讨论序列表达式之前,必须知道什么是序列(sequence),这也是数学的F# 术语。序列是有序的列表,可能包含无穷的元素。这一切听上去有点抽象,但也不用担心,我们已经熟悉这种类型了,在.NET 中表达同样概念的是:IEnumerable<T>。

在.NET 框架中有IEnumerable<T> 类型的主要原因,是它提供一种统一的方法来处理集合数据,比如,数组,词典,可变列表,不可变的F# 列表。在F# 中,我们将讨论序列,因为这是更通用的术语。序列可以表示有限元素的集合,也可以动态生成,在需要时恢复。我们将学习无穷序列,这听起来有些学术化,但是,在实际应用中也可能很有用。

我们首先看一下创建和处理序列的方法。传统的函数式方法是使用高阶函数,但是,现代语言通常提供了更容易的方法。在C# 中,我们可以使用迭代来生成序列,用LINQ 查询去处理已有的序列;而F# 语言把这两个概念统一起来,用序列表达式(sequence expressions)就能完成大部分操作。

在F# 中,序列表达式的语法并不是专为处理序列而设计的、单一用途的语言功能;它正是一个(非常有用!)更通用的结构的应用,称为计算表达式(computation expressions)。计算表达式写出的代码看起来像普通的 F#,但行为迥异。在序列表达式情况下,产生的结果序列不仅仅是一个值,我们将用示例来讨论,用计算表达式进行日志记录,更容易处理选项值。

注意

在很多方面,计算表达式能够自定义代码的含义,但也有一些限制。特别是,用计算表达式写的代码都必须编译成.NET 代码才能执行,而在其中,我们能自定义的基元(primitives)很少。它不能用于操作代码,在不同环境中执行,比如,就像LINQ to SQL 所做的。要在F# 中实现类似功能,我们必须组合本章的概念,一种称为F# 引用(F# quotations)的功能,本书并不讨论,在本书的网站上,可以找到有关引用的资源。

我们首先讨论序列,在熟悉了序列表达式以后,再讨论计算表达式,以及与C# 中的 LINQ 查询的关系。我们将从序列迈出第一步,在使用序列之前,要知道如何创建序列。

时间: 2024-10-23 16:41:57

第十二章 序列表达式和可选工作流的相关文章

【WPF学习】第三十二章 执行命令

原文:[WPF学习]第三十二章 执行命令 前面章节已经对命令进行了深入分析,分析了基类和接口以及WPF提供的命令库.但尚未例举任何使用这些命令的例子. 如前所述,RoutedUICommand类没有任何硬编码的功能,而是只表达命令,为触发命令,需要有命令源(也可使用代码).为响应命令,需要有命令绑定,命令绑定将执行转发给普遍的事件处理程序. 一.命令源 命令库中的命令始终可用.触发他们的最简单的方法是将它们关联到实现了ICommandSource接口的控件,其中包括继承自ButtonBase类的

R in action读书笔记(16)第十二章 重抽样与自助法之 置换检验

第十二章:重抽样与自助法 本章,我们将探究两种应用广泛的依据随机化思想的统计方法:置换检验和自助法 12.1 置换检验 置换检验,也称随机化检验或重随机化检验. 有两种处理条件的实验,十个受试者已经被随机分配到其中一种条件(A或B)中,相应的结果变量(score)也已经被记录.实验结果如下: 如果两种处理方式真的等价,那么分配给观测得分的标签(A处理或B处理)便是任意的.为检验两种处理方式的差异,我们可遵循如下步骤: (1) 与参数方法类似,计算观测数据的t统计量,称为t0: (2) 将10个得

第十二章 APO编程语言

第十二章      APO编程语言 APO编程语言是基于汇编语言和面向对象编程.基本指令只有7种:赋值指令.COPY指令.BTX(位X测试为1.或0转移)指令.查表跳转指令switch(RN){-.}.移位与循环指令S.三操作数运算指令.调用与返回指令.所有的指令大小.除了32位立即数赋值是2字外:其它都是32位,一个字. 指令执行时间,除了32位立即数赋值是2ns.COPY指令取决于拷贝的长度外:其它指令都是1ns. 应用程序只能使用R0-R4,R8-R15的21个寄存器作为高速的寄存器局部变

第十二章类的无参方法

一.javaDoc注释: 语法:/** * *@author FLC */ 生成javaDoc文档的步骤:点击File--Export--展开java文件夹--选择javaDoc--点击Next--制定生成doc文档的文件位置--点击Fish--找到生成文件位置查看. 二.类中的方法: 语法:   访问修饰符  方法返回值类型  方法名称(){} 例如: public void run(){ } public String ball(){ } String ball="球"; retu

Java(第十二章)

第十二章 一.变量的作用域(有效的使用范围) 1.变量有2种 1.1成员变量(属性) 声明在类的里面,方法的外面 1.2 局部变量 声明在方法里面或for循环结构中 2.调用时的注意事项(初始值不同.作用域不同) 2.1 成员变量,有默认值 在当前类直接通过成员变量名调用:在其他类中,通过该类的对象名.属性(成员变量)名调用:成员变量名称在同一个类中是唯一的. 2.2 局部变量,没有默认值,必须先赋值再使用 局部变量,只能在当前的方法中使用,其他方法和其他类不能调用:在同一个方法中名称是唯一的,

第十二章、软件包管理

第十二章.软件包管理 本章内容 ?软件运行环境 ?软件包基础 ?rpm包管理 ?yum管理 ?定制yum仓库 ?编译安装 软件运行和编译 ABI:Application Binary Interface Windows与Linux不兼容 ELF(Executable and Linkable Format) PE(Portable Executable) 库级别的虚拟化: Linux: WINE Windows: Cywin API:Application Programming Interfa

20190825 On Java8 第十二章 集合

第十二章 集合 java.util 库提供了一套相当完整的集合类(collection classes)来解决这个问题,其中基本的类型有 List . Set . Queue 和 Map. 不要在新代码中使用遗留类 Vector ,Hashtable 和 Stack . 泛型和类型安全的集合 new ArrayList<>() 有时被称为"菱形语法"(diamond syntax).在 Java 7 之前,必须要在两端都进行类型声明 ArrayList<Apple&g

C#高级编程第11版 - 第十二章

导航 C# 全版本特性一览 全书目录 第十二章 Language Integrated Query 12.1 LINQ 概述 243 12.1.1 列表和实体 244 12.1.2 LINQ 查询 246 12.1.3 扩展方法 246 12.1.4 推迟查询的执行 248 12.2 标准的查询操作符 249 12.2.1 筛选 250 12.2.2 用索引筛选 251 12.2.3 类型筛选 252 12.2.4 复合的from 子句 252 12.2.5 排序 253 12.2.6 分组 2

C和指针 (pointers on C)——第十二章:使用结构和指针

第十二章 使用结构和指针 这章就是链表.先单链表,后双向链表. 总结: 单链表是一种使用指针来存储值的数据结构.链表中的每个节点包含一个字段,用于指向链表的下一个节点. 有一个独立的根指针指向链表的第1个节点.单链表只能从一个方向遍历. 如何insert单链表:1.新节点的link字段必须设置为指向它的后面节点.2.前一个节点的link字段必须指向这个新节点. 为了防止可能会插入链表的起始位置这种情况,在C中,可以保存一个指向必须进行修改的link字段的指针,而不是保存一个指向前一个节点的指针.