it-swarm-ja.com

Swiftの数値プロトコルが比較可能なプロトコルを継承しないのはなぜですか?

ジェネリックclass MyClass<T: Numeric> {...}を作成し、><を使用しようとした関数でエラーが発生しました。 "Binary operator '>'は2つの 'T'オペランドに適用できません」問題は、宣言で行った構文エラーだと思っていました。しかし、確かに、Numeric継承しないComparable。びっくりした。これはなぜでしょうか?

3
SaganRitual

比較できない注目すべき数値型があります。複素数です。

複素数は、「実数」と「虚数」の部分、または同等に「大きさ」と「位相」で構成されます。虚数に明白な順序はありません。 Comparableを含めないことで、数値プロトコルを使用して複素数を表すこともできます。

Numericには除算も含まれないことに注意してください。これが除外された理由はわかりませんが、除算は整数に対して部分的にのみ定義されていることに注意してください。 3/2は整数値を生成しません。異なる言語はこれに異なる方法で取り組みます(Cはゼロに丸められ、賢明な言語は浮動小数点数を生成し、Perl6は有理数を生成します...)。したがって、実装タイプに決定を行わせるのではなく、数値などの非常に基本的なプロトコルからこれらの決定を除外することは正当なようです。

(より正式には、一般的な数値型は加算と乗算で閉じられます。アンダーフロー付きの符号なし型(つまり、モジュラー演算)と符号付き型も減算で閉じられます。整数は除算では閉じられません。クロージャは、演算の出力型が入力タイプと同じです。)

Numericはscalar値に焦点を当てていますが、順序も除算もない(非スカラー)数学構造の多くの例があります。特に、ベクトルと行列。

プロトコルは、有用性を維持しながら最小限に抑える必要があります。不要なタイプを制約してはなりません。また、SOLIDの原則:インターフェース分離の原則(ISP)は、ユーザーが使用していないメソッドに依存することを強制されるべきではないと述べています。

4
amon