在 GitHub 上編輯此頁面

內容函數 - 更多詳細資訊

語法

Type              ::=  ...
                    |  FunArgTypes ‘?=>’ Type
Expr              ::=  ...
                    |  FunParams ‘?=>’ Expr

內容函式型別向右關聯,例如 S ?=> T ?=> U 等同於 S ?=> (T ?=> U)

實作

內容函式型別是定義具有內容參數的 apply 方法的類別型別的簡寫。特別是,N 元函式型別

T1, ..., TN ?=> R 是類別型別 ContextFunctionN[T1, ..., TN, R] 的簡寫。假設此類別型別具有下列定義,對於任何 N >= 1 的值

package scala
trait ContextFunctionN[-T1, ..., -TN, +R]:
  def apply(using x1: T1, ..., xN: TN): R

內容函式型別抹除為一般函式型別,因此這些類別會在類型檢查時動態產生,但不會在實際程式碼中實現。

內容函式文字 (x1: T1, ..., xn: Tn) ?=> e 將型別為 Ti 的內容參數 xi 對應至評估表達式 e 的結果。每個內容參數 xi 的範圍為 e。參數必須具有成對不同的名稱。

如果預期的內容函數文字類型為 scala.ContextFunctionN[S1, ..., Sn, R] 形式,則 e 的預期類型為 R,且任何參數 xi 的類型 Ti 都可以省略,這種情況下假設 Ti = Si。如果預期的內容函數文字類型為其他類型,則所有內容參數類型都必須明確給出,且 e 的預期類型未定義。內容函數文字的類型為 scala.ContextFunctionN[S1, ...,Sn, T],其中 Te 的擴充類型。T 必須等於不參考任何內容參數 xi 的類型。

內容函數文字評估為實例建立表達式

new scala.ContextFunctionN[T1, ..., Tn, T]:
  def apply(using x1: T1, ..., xn: Tn): T = e

內容參數也可以是使用底線 _ 表示的萬用字元。在這種情況下,會任意選擇參數的新名稱。

注意:Scala 2.13 的 匿名函數區段 的結尾段落已被內容函數類型取代,應予以移除。

內容函數文字 (x1: T1, ..., xn: Tn) ?=> e 會自動建立給任何預期類型為 scala.ContextFunctionN[T1, ..., Tn, R] 的表達式 e,除非 e 本身是內容函數文字。這類似於在依名稱傳遞引數位置的表達式周圍自動插入 scala.Function0

內容函數類型會以與函數類型相同的方式概括為 N > 22,請參閱 對應的文件

範例

請參閱 Simplicitly: foundations and applications of implicit function types 中關於表達性的章節。

類型檢查

在去糖化之後,不需要為內容函數類型額外輸入打字規則。