背景
上下文抽象是一种对上下文进行抽象的方法。它们代表着一种统一的范式,具有各种各样的用例,其中包括
- 实现类型类
- 建立上下文
- 依赖注入
- 表达功能
- 计算新类型,并证明它们之间的关系
其他语言在这方面受到了 Scala 的影响。例如,Rust 的特征或 Swift 的协议扩展。设计提案也已提交给 Kotlin 作为编译时依赖解析,提交给 C# 作为形状和扩展,提交给 F# 作为特征。上下文抽象也是定理证明器(如 Coq 或 Agda)的常见功能。
即使这些设计使用了不同的术语,它们都是术语推理核心思想的变体:给定一个类型,编译器会综合一个具有该类型的“规范”术语。
Scala 3 重新设计
在 Scala 2 中,通过将定义(方法和值)或参数标记为 implicit
来支持上下文抽象(请参阅 上下文参数)。
Scala 3 包括上下文抽象的重新设计。虽然这些概念在 Scala 2 中逐渐被“发现”,但现在它们已广为人知并被理解,并且重新设计利用了这些知识。
Scala 3 的设计重点是意图而不是机制。Scala 3 提供了几个面向用例的功能,而不是提供隐式的非常强大的功能
-
追溯扩展类。在 Scala 2 中,扩展方法通过使用 隐式转换 或 隐式类 编码。相比之下,在 Scala 3 中,扩展方法 现已直接内置到语言中,从而产生更好的错误消息和改进的类型推断。
-
对上下文信息进行抽象。using 子句 允许程序员对调用上下文中可用的信息进行抽象,并应隐式传递。作为对 Scala 2 隐式的改进,using 子句可以通过类型指定,从而使函数签名摆脱了从未明确引用的项变量名。
-
提供类型类实例。given 实例 允许程序员定义特定类型的规范值。这使得使用 类型类 进行编程更加直接,而不会泄露实现细节。
-
将一种类型视为另一种类型。隐式转换已从头开始重新设计为类型类
Conversion
的实例。 -
高阶上下文抽象。全新的 上下文函数 功能使上下文抽象成为一等公民。它们是库作者的重要工具,并允许表达简洁的特定领域语言。
-
来自编译器的可操作反馈。如果编译器无法解析隐式参数,它现在会为你提供 导入建议,这可能会解决问题。
好处
Scala 3 中的这些更改实现了项推断与语言其余部分的更好分离
这些更改的好处包括
- 因此,新设计避免了功能交互并使语言更加一致
- 它使隐式更易于学习,更难滥用
- 它极大地提高了使用隐式函数的 95% Scala 程序的清晰度
- 它有可能以一种原则性的方式启用术语推断,这种方式既可访问又友好
本章在以下部分介绍了这些新功能中的许多功能。
此页面的贡献者
内容
- 简介
- Scala 功能
- 为什么是 Scala 3?
- Scala 简介
- 你好,世界!
- REPL
- 变量和数据类型
- 控制结构
- 领域建模
- 方法
- 一等函数
- 单例对象
- 集合
- 上下文抽象
- 顶级定义
- 摘要
- 首次了解类型
- 字符串插值
- 控制结构
- 领域建模
- 工具
- OOP 建模
- FP 建模
- 方法
- 方法功能
- Scala 3 中的主方法
- 摘要
- 函数
- 匿名函数
- 函数变量
- Eta 展开
- 高阶函数
- 编写你自己的 map 方法
- 创建返回函数的方法
- 摘要
- 打包和导入
- Scala 集合
- 集合类型
- 集合方法
- 摘要
- 函数式编程
- 什么是函数式编程?
- 不可变值
- 纯函数
- 函数是值
- 函数式错误处理
- 摘要
- 类型和类型系统
- 推断类型
- 泛型
- 交集类型
- 并集类型
- 代数数据类型
- 方差
- 不透明类型
- 结构类型
- 依赖函数类型
- 其他类型
- 上下文抽象
- 扩展方法
- 上下文参数
- 上下文范围
- 给定导入
- 类型类
- 多重相等
- 隐式转换
- 摘要
- 并发
- Scala 工具
- 使用 sbt 构建和测试 Scala 项目
- 工作表
- 与 Java 交互
- 面向 Java 开发人员的 Scala
- 面向 JavaScript 开发人员的 Scala
- 面向 Python 开发人员的 Scala
- 下一步去哪里