明天我正在参加SML / NJ的考试,我在几个不同的过去决赛中看到了这个问题,但我不知道如何考虑它。
假设在(虚构的)语言PML中我们将int作为float的子类型。对还是错?
答案 0 :(得分:2)
以下是子类型的定义:http://en.wikipedia.org/wiki/Subtyping
如果float
是超类型,int
是子类型,那么您可以将int
传递给任何需要float
的函数。在面向对象的范例中,您会说int
从float
延伸或下降,意味着int
可以在float
可以使用的任何地方使用,但反之亦然。
我如何看待这是程序员的期望。如果你有一个曾经带过int的函数,你希望它仍能给它一个int。所以你不能替换任何不是int子类型的东西。对于输出,如果您希望获得int,则交换的函数不能返回除int或子类型之外的任何内容。否则,当您将返回的值传递给下一个函数时,它可能会中断。
现在是真/假:
true 因为如果您想要在高阶函数中交换int -> float
函数并使用int -> int
函数或将返回值传递给另一个函数:< / p>
round (int_to_float x) (* or *) round (int_to_int x)
round将能够处理float和int。
false 因为新函数可能利用int
的特定属性,传入的浮点数无法容纳。例如:
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 *)
接下来就是抓住了。在阅读中,宽容是一种方式,在写作时,宽容是另一种方式。唯一的重叠是一种类型,所以你不能替换refs。 假