1

明日、SML/NJ で試験を受けます。過去のいくつかの異なる決勝でこの質問を見ましたが、どう考えたらよいかわかりません。

(架空の) 言語 PML で、 float のサブタイプとして int があるとします。正しいか間違っているか?

  1. int -> int 型の関数は、 int -> float 型の関数の代わりにいつでも提供できます。(真実?)
  2. int -> bool 型の関数は常に float -> bool 型の関数の代わりに提供できます。(真実?)
  3. int -> (int ref) 型の関数は、int -> (float ref) 型の関数の代わりに常に提供できます。(間違い?)
  4. (int x float ) -> int 型の関数は、 (float x int ) -> float 型の関数の代わりにいつでも提供できます。(間違い?)
4

1 に答える 1

2

サブタイプの定義は次のとおりです: http://en.wikipedia.org/wiki/Subtyping

floatがスーパータイプでがサブタイプの場合、を期待する任意の関数に をint渡すことができます。オブジェクト指向のパラダイムでは、どこでも使用できるという意味から拡張または派生すると言えますが、その逆はありません。intfloatintfloatintfloat

私がどう考えるかは、プログラマーの期待と一緒です。以前は int を取っていた関数がある場合は、引き続き int を渡すことができると期待します。したがって、int のサブタイプではないものを代用することはできません。出力については、int を取得することを期待している場合、スワップされた関数は int またはサブタイプ以外のものを返すことはできません。そうしないと、その戻り値を次の関数に渡すと、壊れる可能性があります。

今真/偽:

  1. 関数を高階関数のint -> float関数と交換するか、戻り値を別の関数に渡すことを想像すると、trueになります。int -> int

    round (int_to_float x) (* or *) round (int_to_int x)
    

    round は、float と int の両方を処理できます。

  2. falseは、新しい関数が、int渡される float が対応できない特定のプロパティを利用する可能性があるためです。例:

    fun negative x = x < 0 
    (* subbed for *) 
    fun even x = x mod 2 == 0
    

    明らかに負の場合でもエラーが発生します

  3. falseは、参照からの読み取りと参照への書き込みの両方を考慮する必要があるためです。参照から読み取る場合:

    !x:float    (* int ref or float ref work *)
    x := n:int  (* only int ref works *)
    

    そしてそこに落とし穴があります。読むときは一方的に寛大であり、書くときは他方で寛大です。オーバーラップは 1 つのタイプのみであるため、参照を置き換えることはできません。

  4. 間違い

于 2013-04-26T06:42:48.700 に答える