サブタイプの定義は次のとおりです: http://en.wikipedia.org/wiki/Subtyping
float
がスーパータイプでがサブタイプの場合、を期待する任意の関数に をint
渡すことができます。オブジェクト指向のパラダイムでは、どこでも使用できるという意味から拡張または派生すると言えますが、その逆はありません。int
float
int
float
int
float
私がどう考えるかは、プログラマーの期待と一緒です。以前は int を取っていた関数がある場合は、引き続き int を渡すことができると期待します。したがって、int のサブタイプではないものを代用することはできません。出力については、int を取得することを期待している場合、スワップされた関数は int またはサブタイプ以外のものを返すことはできません。そうしないと、その戻り値を次の関数に渡すと、壊れる可能性があります。
今真/偽:
関数を高階関数のint -> float
関数と交換するか、戻り値を別の関数に渡すことを想像すると、trueになります。int -> int
round (int_to_float x) (* or *) round (int_to_int x)
round は、float と int の両方を処理できます。
falseは、新しい関数が、int
渡される float が対応できない特定のプロパティを利用する可能性があるためです。例:
fun negative x = x < 0
(* subbed for *)
fun even x = x mod 2 == 0
明らかに負の場合でもエラーが発生します
falseは、参照からの読み取りと参照への書き込みの両方を考慮する必要があるためです。参照から読み取る場合:
!x:float (* int ref or float ref work *)
x := n:int (* only int ref works *)
そしてそこに落とし穴があります。読むときは一方的に寛大であり、書くときは他方で寛大です。オーバーラップは 1 つのタイプのみであるため、参照を置き換えることはできません。
間違い