@dkの答えに加えて、私はハスケルがそれをどうやってそれを行うのかを比較したいと思います。
ハスケルでは、すべての特定のタイプを大文字で開始する必要があります。
data mytype Var = Constructor {
myVar :: Var,
myInt :: Foo
}
その代わり、Haskellは型変数のために、小文字文字で始まるタイプの留保:したがって、それは書くことは違法である。ここ
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
が特異的である。あいまいさはなく、ローカル推論だけが必要です。
この機能を使用すると、多少の冗長さを感じるかもしれませんが、私はこの船が航行したと確信しています。この機能を追加することで、同じことを少しでも増やすことができます。しかし、この機能は、言語ユーザーが学ばなければならない別の機能を持つコストを追加します。
[ust by Example](https://rustbyexample.com/generics/impl.html)で行くと、 'impl Foo 'はすでに何かを意味していると思います。「1つのFooジェネリック型を実装するT "と呼ばれる特定のタイプのものである。 –
millimoose
逆の状況を想像してみましょう: 'impl Foo'は「32ビット整数のFooの実装」または「i32'という名前の型パラメータのFooの汎用実装」を意味しますか?このあいまいさは、他の場合には言及していません。 –
millimoose
@millimoose:したがって、いくつかのケースでは、<>は一般的なものであり、特定のタイプのものもありますか?構文に慣れていないと、どちらが私が扱っているのかを知ることは難しいようです。 – l0b0