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

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

 

假设我们有一个关于城市的元组列表,每个元组包含城市的名字和它所在的国家,另外,我们还有一个列表,是用户所选的城市。因此,我们可以这样表示样本数据:

 

let cities = [ ("New York","USA"); ("London", "UK");

                  ("Cambridge","UK"); ("Cambridge", "USA") ]

let entered = [ "London";"Cambridge" ]

 

现在,假设我们要找出选定城市的国家。我们可以在 cities 列表中遍历所选的城市,找到国家。你可能可能已经看出了这种方法的问题了:有一个名为 Cambridge 的城市,在英国和美国都有,因此,对于一个城市,需要能够返回多条记录。在清单 12.10 中可以看到,我们在序列表达式中使用两个嵌套的 for 循环。

 

清单12.10 使用序列表达式联接集合 (F# Interactive)

> seq { for name in entered do     [1]

              for (n, c) in cities do     [2]

                if (n = name) then            | [3]

                  yield sprintf "%s(%s)" n c };;  |

val it : seq<string> =                                   | 返回剑桥的

seq [ "London (UK)";"Cambridge (UK)"; "Cambridge (USA)" ]  | 两个国家

 

外层的 for 循环遍历 entered 中的名字[1],嵌套的循环遍历 cities 列表[2]。这样,在嵌套的循环体内部,我们就可以比较每个输入城市的名字,是否与每个已知城市的名字相等。如果名字相同的话,嵌套在两个循环内的代码[3]使用 yield 语句,生成一个项目;如果名字不一样,就不产生任何元素。

用数据库术语来说,这个操作可以用联接(jion)来解释。输入名字的列表与包含城市信息的列表,使用城市名字作为键,进行联接。使用序列表达式来写这个代码是很容易的,它是 F# 中联接编程的首选方式。

我们提到过,任何序列表达式可以写成使用平面映射的操作,因此,我们可以看一下如何显式使用 Seq.collect 重写前面的示例。实际你不会这样做,但是,当我们研究类似于可选工作流,定义自己的、序列表达式时,这将是非常宝贵的。

内容概要:《学术研究提示设计 50 招》是一份详尽的指南,旨在帮助研究人员提高学术写作和研究效率。该文档涵盖了从论文撰写、润色、翻译、查重降重、参考文献管理、投稿审稿到文献阅读等多个方面的具体操作指令。每一章节均针对特定任务提供了详细的步骤和注意事项,例如如何撰写标题、摘要、致谢,如何进行英文润色、英翻译,以及如何优化逻辑结构等。文档还介绍了如何利用AI工具进行文献分析、术语表提取和研究方向探索等内容,为研究者提供了全面的支持。 适合人群:适用于学术研究人员,特别是那些需要撰写、润色和提交学术论文的研究者,包括研究生、博士生及高校教师等。 使用场景及目标:① 提供一系列具体的指令,帮助研究者高效完成论文的各个部分,如撰写标题、摘要、致谢等;② 提供润色和翻译的详细指导,确保论文语言的准确性和专业性;③ 提供查重降重的方法,确保论文的原创性;④ 提供参考文献管理和投稿审稿的指导,帮助研究者顺利发表论文;⑤ 利用AI工具进行文献分析、术语表提取和研究方向探索,提高研究效率。 阅读建议:此资源不仅提供了具体的指令和方法,更重要的是引导研究者如何思考和解决问题。因此,在学习过程,不仅要关注具体的步骤,还要理解背后的原理和逻辑,结合实际案例进行实践和反思。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值