2013-04-26 27 views
1

我明天在SML/NJ参加考试,我在一些不同的过去的决赛中看到过这个问题,但是我不知道该如何思考。分类正确或错误(SML/NJ)

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

  1. int类型的函数 - >浮 - > INT总是可以代替类型 INT的函数来提供。 (true?)
  2. 总是可以提供类型为int - > bool的函数来代替类型为 的函数float - > bool。 (true?)
  3. 总是可以提供类型为int - >(int ref)的函数来代替 int - >(float ref)的函数。 (false?)
  4. 可以始终提供类型为(int x float) - > int的函数来代替type(float x int) - > float的函数。 (?假)

回答

2

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

如果float是超,并int是子类型,那么你可以传递一个int成期望一个float任何功能。在面向对象的范例中,你会说intfloat延伸或下降,这意味着int可以在任何地方使用float可以,但不是反之亦然。

我如何看待程序员的期望。如果你有一个函数曾经接受一个int,你期望能够仍然给它一个int。所以你不能取代任何不是int的子类型的东西。对于输出,如果你期望得到一个int,交换函数不能返回除int或子类型之外的任何东西。否则,当你将返回的值传递给下一个函数时,它可能会中断。

现在真/假:

  1. 真正因为如果你想像换一个int -> float功能与int -> int一个在高阶函数或返回值传递给另一个函数:

    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. ,因为你必须要考虑从参考两读,写的参考。当从参考读数:

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

    并在那里的渔获。在阅读时,有一种宽容的方式,在写作时,宽容是另一种方式。唯一的重叠是一种类型,所以你不能代替裁判。

+0

由于这是一个更加清晰吧! – user2066749 2013-04-26 11:33:24