除了@dk的回答,我想比較一下Rust如何對Haskell做它。
在Haskell中,所有特定類型必須啓動大寫。因此,它是非法的寫:
data mytype Var = Constructor {
myVar :: Var,
myInt :: Foo
}
相反,哈斯克爾保留其用小寫字母開頭的類型變量類型:
data MyType var = Constructor {
myVar :: var
myInt :: Int
}
instance MyClass (MyType var) where
...
這裏,var
是一個類型變量,MyType
是混凝土,並且Int
是具體的。
在我看來 - 你可能不會分享,Rust犯了錯誤,以允許非大寫的類型標識符。因此,語言沒有別的選擇,只能要求你明確地說出哪些類型標識符是變量,哪些是特定的。可以說Rust的明確性提高了可讀性。反過來也可以爭辯。
鏽當然可以增加一個假想的功能,您可能會說:
impl Foo<#T, T, u32> { .. }
這裏,前綴#
被認爲是指「這是一個類型變量」,所以#T
是一個類型變量,T
是具體而言,u32
是特定的。沒有歧義,只需要本地推理。
有了這個功能,你可能會有點少冗長,但我堅信這艘航行了 - 現在加入這個功能,只會增加做同樣的事情了非常小的收益的另一種方式。然而,該功能會增加語言用戶必須學習的另一個功能的成本。
通過[Rust By Example](https://rustbyexample.com/generics/impl.html),我猜這是因爲'impl Foo'已經意味着別的東西:「將Foo泛型類型實現爲一個特定類型,稱爲T「。 –
millimoose
想象相反的情況:不'IMPL富'的意思是「爲32位整數實現的Foo」或「通用實現美孚的一個'i32'任何類型的參數」?您提到的其他情況中沒有這種含糊之處。 –
millimoose
@millimoose:所以在某些情況下,''''表示泛型,並且在某種特定類型中?看起來很難知道我在處理哪一個而不熟悉語法。 – l0b0