內容函數 - 更多詳細資訊
語法
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]
,其中 T
是 e
的擴充類型。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 中關於表達性的章節。
類型檢查
在去糖化之後,不需要為內容函數類型額外輸入打字規則。