12.3.3 平面映射(flattening projection)

12.3.3 平面映射(flatteningprojection)

平面映射,可以为源集合中的每个元素,生成元素序列,合并所有返回序列。我们很快就会看到,这是定义其他处理操作,包括映射和筛选,的基本操作。平面映射所独有的特征,就是能够为每个输入元素生成多个输出元素。

注意

在 LINQ 库中,这个操作称为 SelectMany。在查询表达式中,用多个 from 子句表示。从名字可以看出,它类似于 Select 操作,但是能够为源中的每个项目返回多个元素。F# 库中对应的函数是 Seq.collect。在这里,名字暗示了实现,就像调用 Seq.map 函数,生成序列的序列,然后,调用 Seq.concat,将它们串联起来。

我们先来看一个需要平面映射的例子,即,只用高阶函数不可能写出这个示例,像前一节的一样。我们先看一下用 F# 序列表达式的实现,然后,再逐步修改代码,使用映射。

时间: 2024-10-14 09:37:07

12.3.3 平面映射(flattening projection)的相关文章

12.3.3.2 直接使用平面映射

首先,我们要看看平面映射到底是什么样子.通常,理解函数如何运行的第一步,就是研究类型签名.图 12.2 比较了 Seq.map(普通映射)和 Seq.collect(平面映射)的类型签名. 图 12.2 对于每个输入元素,普通映射返回一个元素,而平面映射,可以返回元素的任意集合. 提醒一下,类型签名中的 # 号,描述映射函数,传递给 collect,表示函数的返回类型不必一定是 seq <'b> 类型.在前一章,我们讨论过使用 # 号的类型声明,#seq<'b> 位置上可以用实现了

12.3.3.3 在 C# 中使用平面映射

类似于 collect 函数的LINQ 运算符,是 SelectMany,但两者之间也有差异,因为 LINQ 有不同的要求.而 F# 序列表达式只能使用 collect 函数表示,LINQ 查询可以使用许多其它运算符,所以,对于序列操作,它们需要不同的方式. 我们再先看一下普通语法,然后,再考虑转换成使用显式扩展方法的语法,我们还使用前面的 F# 示例的数据.有关国家信息的城市列表中包含了 CityInfo 类的实例,有两个属性,输入名字的列表只包含字符串.清单 12.13 展示的是我们写的 L

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

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

(12)Hibernate一对一映射

只要你肯努力,没有什么事情是你不能搞砸的. 需求:一个汽车(Car)有一个引擎(Engine),它是一对一的映射关系. 对于一对一的映射,有两种实现方式:基于外键的映射和基于主键的映射.这两种方式学习的重点就是映射文件的配置,推荐使用第一种方式. 1.基于外键的映射 Car.java package com.rk.hibernate.k_one2one; public class Car { private int carId; private String carName; private E

Ubuntu 12.04 修改键盘映射

背景: (1) 我的笔记本G450上,Page_up/Page_down键分别和Home/End在同一个键位上,需要同时按住Fn键才能敲出Home/End (2) 习惯用Vim的同志都有这个感觉,Esc键太远了,因此,何不把Caps与Esc对掉一下呢 解决: Page_up/Page_down与Home/End互换 需要知道四个键的keycode$ xev | grep keycode 利用软件xmodmap,编写脚本文件(e.g. .swap_keys),将下面的内容复制到里面!swap Pa

有用函数编程

<序> 感谢 关于本书 关于封面 第一部分 学习函数式思维 第一章 不同的思维 1.1 什么是函数式编程? 1.2 通往有用函数编程之路 1.3 用函数式编程提高生产力 1.3.1 函数范式 1.3.2 声明式编程风格 1.3.3 了解程序的执行 1.3.4 设计并发友好的应用程序 1.3.5 函数风格怎样形成代码 1.4 函数式编程演示样例 1.4.1 用声明式风格表达意图 1.4.1.1 用 LINQ 处理数据 1.4.1.2 用 XAML 描写叙述用户界面 1.4.1.3 声明式函数动画

12.3.2 筛选和映射

最常用的序列处理运算,是筛选(filtering)和映射(projection):在第六章,我们用它们处理 F# 函数式列表,和 C# 的泛型 .NET List<T> 类型.LINQ 库中的 Where 和 Select 扩展方法已经可以处理序列,而在 F# 中,使用Seq 模块中两个函数(即 Seq.map 和 Seq.filter),能达到相同效果.

12.3.2.2 使用查询和序列表达式

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

8.Hibernate的多对多关联映射

1.创建如下数据库脚本 1 --2.项目表 2 -- Create table 3 create table PROJECT 4 ( 5 PROID NUMBER(6) not null, 6 PRONAME VARCHAR2(50) 7 ) 8 tablespace USERS 9 pctfree 10 10 initrans 1 11 maxtrans 255 12 storage 13 ( 14 initial 64 15 minextents 1 16 maxextents unlimi