【问题标题】:Subtyping true or false (SML/NJ)子类型真或假 (SML/NJ)
【发布时间】:2014-05-16 07:18:58
【问题描述】:

我明天要参加 SML/NJ 的考试,我在过去的几次决赛中都看到了这个问题,但我不知道该怎么想。

假设在(虚构的)语言 PML 中,我们将 int 作为 float 的子类型。是真是假?

  1. 总是可以提供 int 类型的函数 -> int 来代替类型的函数 整数 -> 浮动。 (对吗?)
  2. int 类型的函数 -> bool 总是可以提供来代替类型的函数 浮动->布尔。 (对吗?)
  3. 总是可以提供 int 类型的函数 -> (int ref) 来代替类型的函数 int ->(浮点参考)。 (假的?)
  4. 始终可以提供 (int x float ) -> int 类型的函数来代替 (float x int ) -> float 类型的函数。 (假的?)

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    这是子类型的定义:http://en.wikipedia.org/wiki/Subtyping

    如果float 是超类型,int 是子类型,那么您可以将int 传递给任何需要float 的函数。在面向对象的范式中,您会说 intfloat 扩展或下降,这意味着 int 可以在 float 可以使用的任何地方使用,但反之则不行。

    我的想法是对程序员的期望。如果您有一个曾经采用 int 的函数,您希望仍然能够给它一个 int。所以你不能替换任何不是 int 子类型的东西。对于输出,如果您希望得到一个 int,则交换函数不能返回除 int 或子类型以外的任何内容。否则,当您将该返回值传递给下一个函数时,它可能会中断。

    现在真/假:

    1. true 因为如果您想象在高阶函数中将 int -> float 函数与 int -> int 交换或将返回值传递给另一个函数:

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

      round 将能够处理浮点数和整数。

    2. false 因为新函数可能会利用 int 的特定属性,而传入的浮点数无法容纳这些属性。示例:

      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 *)
      

      这就是问题所在。读时宽以一种方式,写作时宽以另一种方式。唯一的重叠是一种类型,所以你不能替换 refs。

    【讨论】:

      猜你喜欢
      • 2013-01-30
      • 2010-12-20
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 2014-07-15
      • 1970-01-01
      • 2014-02-17
      相关资源
      最近更新 更多