背景
情境抽象是一種抽象化情境的途徑。它們代表著一個統一的範例,有各種不同的使用案例,其中包括
- 實作類型類別
- 建立情境
- 相依性注入
- 表達功能
- 運算新的類型,並證明它們之間的關係
其他語言在這方面受到 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 程式碼的清晰度
- 它有潛力以一種有原則、且易於使用和友善的方式啟用術語推論
本章在以下各節中介紹了許多這些新功能。
此頁面的貢獻者
內容
- 簡介
- Scala 功能
- 為什麼是 Scala 3?
- Scala 的品味
- Hello, World!
- REPL
- 變數和資料類型
- 控制結構
- 網域建模
- 方法
- 一級函數
- 單例物件
- 集合
- 情境抽象
- 頂層定義
- 摘要
- 類型初探
- 字串內插
- 控制結構
- 網域建模
- 工具
- OOP 建模
- FP 建模
- 方法
- 方法特徵
- Scala 3 中的主要方法
- 摘要
- 函數
- 匿名函數
- 函數變數
- Eta 展開
- 高階函數
- 撰寫自己的 map 方法
- 建立回傳函數的方法
- 摘要
- 封裝和匯入
- Scala 集合
- 集合類型
- 集合方法
- 摘要
- 函數式程式設計
- 什麼是函數式程式設計?
- 不變值
- 純函數
- 函數是值
- 函數式錯誤處理
- 摘要
- 類型和類型系統
- 推論類型
- 泛型
- 交集類型
- 聯集類型
- 代數資料類型
- 變異
- 不透明類型
- 結構類型
- 相依函數類型
- 其他類型
- 情境抽象
- 擴充方法
- 內容參數
- 內容界限
- 給定匯入
- 類型類別
- 多重等式
- 隱式轉換
- 摘要
- 並行處理
- Scala 工具
- 使用 sbt 建立和測試 Scala 專案
- 工作表
- 與 Java 互動
- 針對 Java 開發人員的 Scala
- 針對 JavaScript 開發人員的 Scala
- 針對 Python 開發人員的 Scala
- 後續步驟