从集合运算设计 Lambda 语法

简介: 集合化程序语言通过简洁的语句实现复杂集合运算,Lambda语法的设计至关重要。首先,直接使用集合成员进行简单运算如求和,无需Lambda。接着,引入Lambda表达式处理更复杂的运算,如计算平方和。SPL使用“~”表示当前成员,简化表达,而SQL则依赖字段引用机制,牺牲了对泛型成员的支持。在嵌套引用时,采用就近原则避免歧义。SPL拓展了SQL的数据组织,支持任意成员的集合,使Lambda语法更加灵活。

拥有集合化特性的程序语言能让我们用很少的语句写出针对集合的复杂运算,其中处于核心地位的是 Lambda 语法设计得是否方便,直接决定了程序语言的描述效率。

我们来从简单到复杂考查集合运算的可能情况,看看好的 Lambda 语法都需要适应那些需求。

首先是直接使用集合成员的运算,比如计算集合成员的合计。

这是最简单的情况,采用普通的函数语法风格就可以,将待计算的集合作为参数传入,比如 sum(A) 用于计算集合 A 成员的合计,当然也可以使用对象式的语法风格写成 A.sum()。
这时候还不涉及 Lambda 语法,仅是把集合本身作为函数的参数。这个算第零条。

然后要能方便地在计算式中引用集合成员,作为第一条。

如果不是要计算集合成员的合计,而是要计算平方和,那么这个平方该如何描述?

这就要开始用到 Lambda 语法了,平方在这里本质上是一个函数,它以集合的当前成员作为参数,返回该参数的平方。Lambda 语法允许将某个函数以参数形式写进另一个函数,这样一条语句就搞定了,不必专门再定义这个函数。

但这里就有一个问题,在 Lambda 语法中用什么标识符或符号表示这个当前成员呢?

Java 等语言会像普通函数那样先定义参数名,这会让 Lamdba 表达式写得很臃肿,失去简洁性,不是个好办法。

对于这种极为常见的情况,用一个固定标识符或符号显得更简单。比如 SPL 中使用 ~ 表示当前成员,平方和就可以写成 A.sum(~~),简单易懂。也可以分两步做,先计算出集合成员的平方构成一个新集合,再计算新集合的合计,写成 A.(~~).sum() 的形式。

但是,被认为有集合化特性的 SQL 中并没有使用某个符号或标识符来表示当前成员,那么 SQL 又是怎么解决这一问题的呢?

SQL 并没有普通意义上可由任何数据构成的集合。SQL 的集合就是表,表的成员是记录。SQL 有记录的概念,但并不能把记录作为一种数据类型来引用。如果我们要在 SQL 中针对一个单值成员的集合运算,也只能把单值理解为只有一个字段的记录,然后针对这些记录构成的表运算。所有计算都是针对某些字段的,而不能针对整条记录。

但这和 SQL 没有表示当前成员的符号有什么关系呢?

我们在讲集合化特性时还提到,面向结构化数据的 Lambda 语法要有简洁方式引用字段,SQL 就提供了可以直接引用字段的便捷机制,而 SQL 又只能计算字段,那就可以不必再提供引用当前成员(记录)的手段了。SQL 中计算平方和一定是某个字段的平方和,而整条记录作为集合成员时,计算平方和是没有意义的。

SQL牺牲了集合的表达能力而简化了语法。但是,对于能够支持泛型成员构成集合的 SPL 来讲,~ 写法就是必要的了。

同时,如果用于结构化数据计算时,SQL 这种可以直接引用字段的写法也要得到支持才会方便,计算销售金额时总要写成 "~.price~.quantity",显然不如写成 "pricequantity“更简单直观。SPL 也提供了这样的支持,这也就是 Lambda 语法的第二条,面对结构化数据时可以直接引用字段。

第三,还要考虑嵌套引用时的规则

集合运算在本质上是一个循环,而循环语句可能多层嵌套,集合运算同样可能会嵌套。比如计算 A,B 两个集合的交集,简单的算法就是循环 A 的成员,看是不是在 B 集合中出现过,这就会涉及到两层循环。

这时候 ~ 写法就会产生歧义了,到底是指 A 集合还是 B 集合的当前成员,这需要在语法规则上做一个明确的约定。

一般可以采用就近原则,即如果没有指明 ~ 是哪个集合的,那缺省认为是内层集合的,而外层集合的当前成员则需要显式地指出其从属于哪个集合。遵循这个规则的 SPL,计算交集的表达式可以写成 A.select(B.count(~==A.~)>0),其中的 ~ 缺省表示 B 的当前成员,而另一个要显式地写成 A.~ 以示区分。

面对结构化数据计算时可以直接引用字段名,也会产生内外层的歧义,也同样适用于就近原则。SQL 就是这样。当内外层表有相同字段名时,则缺省被认为是内层表的字段,引用外层表的同名字段时必须显式地写上表名;如果内外层表中没有相同字段名,则可以正确识别出来而不必书写表名。SPL 也支持这一规则。

SQL 在集合运算的 Lambda 语法设计上的总体表现不错,除了缺乏泛型成员的集合外,用于描述常规集合运算还是比较方便简捷的。SPL 拓展了 SQL 的数据组织,也就是引入了离散性,支持任意成员的集合,Lambda 语法也稍多了一些内容。

SPL已开源免费,欢迎前往乾学院了解更多!

相关文章
|
7天前
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
随着云计算和DevOps的兴起,容器技术和自动化在软件开发中扮演着愈发重要的角色,但也带来了新的安全挑战。阿里云针对这些挑战,组织了一场关于云上安全的深度访谈,邀请了内部专家穆寰、匡大虎和黄竹刚,深入探讨了容器安全与软件供应链安全的关系,分析了当前的安全隐患及应对策略,并介绍了阿里云提供的安全解决方案,包括容器镜像服务ACR、容器服务ACK、网格服务ASM等,旨在帮助企业构建涵盖整个软件开发生命周期的安全防护体系。通过加强基础设施安全性、技术创新以及倡导协同安全理念,阿里云致力于与客户共同建设更加安全可靠的软件供应链环境。
150228 10
|
4天前
|
供应链 监控 安全
|
15天前
|
弹性计算 人工智能 安全
对话 | ECS如何构筑企业上云的第一道安全防线
随着中小企业加速上云,数据泄露、网络攻击等安全威胁日益严重。阿里云推出深度访谈栏目,汇聚产品技术专家,探讨云上安全问题及应对策略。首期节目聚焦ECS安全性,提出三道防线:数据安全、网络安全和身份认证与权限管理,确保用户在云端的数据主权和业务稳定。此外,阿里云还推出了“ECS 99套餐”,以高性价比提供全面的安全保障,帮助中小企业安全上云。
201928 14
对话 | ECS如何构筑企业上云的第一道安全防线
|
6天前
|
SQL 安全 前端开发
预编译为什么能防止SQL注入?
SQL注入是Web应用中常见的安全威胁,攻击者通过构造恶意输入执行未授权的SQL命令。预编译语句(Prepared Statements)是一种有效防御手段,它将SQL代码与数据分离,确保用户输入不会被解释为SQL代码的一部分。本文详细介绍了SQL注入的危害、预编译语句的工作机制,并结合实际案例和多语言代码示例,展示了如何使用预编译语句防止SQL注入,强调了其在提升安全性和性能方面的重要性。
|
10天前
|
搜索推荐 物联网 PyTorch
Qwen2.5-7B-Instruct Lora 微调
本教程介绍如何基于Transformers和PEFT框架对Qwen2.5-7B-Instruct模型进行LoRA微调。
422 34
Qwen2.5-7B-Instruct Lora 微调
|
1月前
|
人工智能 自然语言处理 前端开发
从0开始打造一款APP:前端+搭建本机服务,定制暖冬卫衣先到先得
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
9956 29
|
3天前
|
人工智能 算法 搜索推荐
阿里云百炼xWaytoAGI共学课开课:手把手学AI,大咖带你从零搭建AI应用
阿里云百炼xWaytoAGI共学课开课啦。大咖带你从零搭建AI应用,玩转阿里云百炼大模型平台。3天课程,涵盖企业级文本知识库案例、多模态交互应用实操等,适合有开发经验的企业或独立开发者。直播时间:2025年1月7日-9日 20:00,地点:阿里云/WaytoAGI微信视频号。参与课程可赢取定制保温杯、雨伞及磁吸充电宝等奖品。欢迎加入钉钉共学群(群号:101765012406),与百万开发者共学、共享、共实践!
|
3天前
|
SQL 存储 Apache
基于 Flink 进行增量批计算的探索与实践
本文整理自阿里云高级技术专家、Apache Flink PMC朱翥老师在Flink Forward Asia 2024的分享,内容分为三部分:背景介绍、工作介绍和总结展望。首先介绍了增量计算的定义及其与批计算、流计算的区别,阐述了增量计算的优势及典型需求场景,并解释了为何选择Flink进行增量计算。其次,详细描述了当前的工作进展,包括增量计算流程、执行计划生成、控制消费数据量级及执行进度记录恢复等关键技术点。最后,展示了增量计算的简单示例、性能测评结果,并对未来工作进行了规划。
254 5
基于 Flink 进行增量批计算的探索与实践
|
3天前
|
人工智能 自然语言处理 API
阿里云百炼xWaytoAGI共学课DAY1 - 必须了解的企业级AI应用开发知识点
本课程旨在介绍阿里云百炼大模型平台的核心功能和应用场景,帮助开发者和技术小白快速上手,体验AI的强大能力,并探索企业级AI应用开发的可能性。

热门文章

最新文章