分类真或假(SML / NJ)

时间:2013-04-26 03:52:07

标签: sml smlnj

明天我正在参加SML / NJ的考试,我在几个不同的过去决赛中看到了这个问题,但我不知道如何考虑它。

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

  1. int类型的函数 - >始终可以提供int来代替类型的函数 int - >漂浮。 (真?)
  2. int类型的函数 - >可以始终提供bool来代替类型的功能 浮动 - >布尔(真?)
  3. int类型的函数 - >始终可以提供(int ref)来代替类型的函数 int - > (浮动参考)。 (错?)
  4. 类型的函数(int x float) - >总是可以提供int来代替类型的函数(float x int) - >漂浮。 (错?)

1 个答案:

答案 0 :(得分:2)

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

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

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

现在是真/假:

  1. true 因为如果您想要在高阶函数中交换int -> float函数并使用int -> int函数或将返回值传递给另一个函数:< / p>

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

    round将能够处理float和int。

  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。