我正在准备期末考试,遇到了一个问题。主题是子类型,我理解子类型对记录的工作原理,但对于函数,我完全不明白它是如何工作的。我从考试中取了一个例子,你不必做整个例子。如果有人向我解释它对超类型和子类型的工作原理,对我来说就足够了,所以一个是超类型的例子,一个是子类型的例子,这样我就可以在其他例子中得到指导。
考虑类型
{ head : int, neck : int, toes : int list} -> { hands : int, feet : int}
对于以下每种类型,如果它是上述类型的子类型,则回答“子类型”;如果它是上述类型的超类型,则回答“超类型”;如果都不是,则回答“都不是”;如果是子类型和超类型,则回答“两者兼有”。i. { toes : int list, neck : int } -> { hands : int, feet : int}
ii. { head : int, neck : int, toes : int list} -> { hands : int, feet : int, arms : int}
iii. { toes : int list, neck : int } -> { hands : int, feet : int, arms : int}.
iv. { hands : int, feet : int} -> { head : int, neck : int, toes : int list}
v.{ head : int, neck : int, toes : int list, fingers : int list} -> { feet : int}
我尝试了这条规则,但没有产生预期的输出。
函数子类型的一般规则是:If t3 <: t1 and t2 <: t4, then t1->t2 <: t3->t4
这
t3 <: t1
意味着t3 is subtype for t1
谢谢。
让我们尝试将该规则应用于所有情况。
i.
{ toes : int list, neck : int }
是 的超类型{ head : int, neck : int, toes : int list}
,而{ hands : int, feet : int}
是 的子类型(也是超类型){ hands : int, feet : int}
,因此满足函数子类型的规则,所以答案是“子类型”。ii.
{ head : int, neck : int, toes : int list}
是 的超类型(和子类型){ head : int, neck : int, toes : int list}
,而{ hands : int, feet : int, arms : int}
是 的子类型{ hands : int, feet : int}
,因此规则再次得到满足,答案仍然是“子类型”。iii.
{ toes : int list, neck : int }
是 的超类型{ head : int, neck : int, toes : int list}
,而{ hands : int, feet : int, arms : int}
是 的子类型{ hands : int, feet : int}
,因此规则再次得到满足,答案再次是“子类型”。iv.
{ hands : int, feet : int}
与 无关{ head : int, neck : int, toes : int list}
,因此我们可以立即得出结论,答案是“都不是”。v.
{ head : int, neck : int, toes : int list, fingers : int list}
是 的子类型{ head : int, neck : int, toes : int list}
,而 类型{ feet : int}
是 的超类型,{ hands : int, feet : int}
因此原始函数类型是该类型的子类型,所以答案是“超类型”。