Scala 3 — 書籍

情境抽象

語言

背景

情境抽象是一種抽象化情境的途徑。它們代表著一個統一的範例,有各種不同的使用案例,其中包括

  • 實作類型類別
  • 建立情境
  • 相依性注入
  • 表達功能
  • 運算新的類型,並證明它們之間的關係

其他語言在這方面受到 Scala 的影響。例如,Rust 的特質或 Swift 的協定延伸。設計提案也已針對 Kotlin 作為編譯時期相依性解析、針對 C# 作為 Shapes 和 Extensions 或針對 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 的實例。

  • 高階上下文抽象context 函式全新功能使上下文抽象成為一級公民。它們是程式庫作者的重要工具,並允許表達簡潔的特定領域語言。

  • 編譯器的可執行回饋。如果編譯器無法解析隱含參數,它現在會提供 匯入建議,可能可以解決問題。

好處

Scala 3 中的這些變更,達到了術語推論與語言其他部分更好的分離

  • 定義給定的方式只有一個
  • 引入隱含參數和參數的方式只有一個
  • 有一個單獨的方式來 匯入給定,這不允許它們隱藏在大量的正常匯入中
  • 定義 隱含轉換 的方式只有一個,它被清楚地標記出來,並且不需要特殊語法

這些變更的好處包括

  • 因此,新設計避免了功能互動,並使語言更一致
  • 它使隱含變數更容易學習且更難被濫用
  • 它大幅改善了使用隱含變數的 95% Scala 程式碼的清晰度
  • 它有潛力以一種有原則、且易於使用和友善的方式啟用術語推論

本章在以下各節中介紹了許多這些新功能。

此頁面的貢獻者