面向型別程式設計/型別變異
外觀
< 面向型別程式設計
考慮以下型別層次結構
type A {}
type B : A {}
type F[T] {}
在沒有型別引數的情況下,F 是一個型別運算子,而 F[A] 和 F[B] 是適當的型別。通常,兩者都不是對方的子型別。但是,根據其引數的層次結構,它們有時可能在子型別關係中是有意義的。如果我們按如下方式宣告 F
type F[cov T] {}
那麼 F[B] 將是 F[A] 的子型別,因為 B 是 A 的子型別。相反,如果我們宣告 F 為
type F[con T] {}
那麼 F[A] 將是 F[B] 的子型別。在前面的情況下,我們說 F 在其型別引數中是協變的,而在後面的情況下,它是逆變的(因為層次結構被反轉)。
型別變異的一個現實世界例子是函式型別。當我們期望一個返回型別為 A 的函式(即型別為 Func[A] 的函式)時,我們始終可以使用型別為 Func[B] 的函式來代替它。另一方面,當我們期望一個引數型別為 B 的函式(即型別為 Func[B,X] 的函式)時,我們始終可以使用型別為 Func[A,X] 的函式來代替它。總而言之,函式型別在其返回型別中是協變的,在其引數型別中是逆變的。
注意:可以使用 Funcy 應用程式試用虛擬碼,該應用程式可以從 Apple 的 App Store (iOS/macOS)、Google Play (Android) 或 亞馬遜應用商店 免費下載。要執行的程式碼必須放置在 main {} 塊中。