Scala 3 — 书籍

上下文抽象

语言

背景

上下文抽象是一种对上下文进行抽象的方法。它们代表着一种统一的范式,具有各种各样的用例,其中包括

  • 实现类型类
  • 建立上下文
  • 依赖注入
  • 表达功能
  • 计算新类型,并证明它们之间的关系

其他语言在这方面受到了 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 程序的清晰度
  • 它有可能以一种原则性的方式启用术语推断,这种方式既可访问又友好

本章在以下部分介绍了这些新功能中的许多功能。

此页面的贡献者