存在類型

badge

如果存在對應于?的for-all類型,那么很自然地假設存在對應于?的存在類型 存在類型并不難。你已經知道存在類型,只是沒有意識到它本身

T: Trait
f x: T = ...

上面的 trait T 被用作存在類型 相比之下,小寫的T只是一個Trait,X是一個for-all類型

f|X <: T| x: X = ...

事實上,existential 類型被 for-all 類型所取代。那么為什么會有存在類型這樣的東西呢? 首先,正如我們在上面看到的,存在類型不涉及類型變量,這簡化了類型規范 此外,由于可以刪除類型變量,因此如果它是一個全推定類型,則可以構造一個等級為 2 或更高的類型

show_map f: (|T| T -> T), arr: [Show; _] =
    arr.map x ->
        y = f x
        log y
        y

但是,如您所見,existential 類型忘記或擴展了原始類型,因此如果您不想擴展返回類型,則必須使用 for-all 類型 相反,僅作為參數且與返回值無關的類型可以寫為存在類型

# id(1): 我希望它是 Int
id|T|(x: T): T = x
# |S <: Show|(s: S) -> () 是多余的
show(s: Show): () = log s

順便說一句,類不稱為存在類型。一個類不被稱為存在類型,因為它的元素對象是預定義的 存在類型是指滿足某種Trait的任何類型,它不是知道實際分配了什么類型的地方。