Racket函数子类型理解困惑:求示例解析
函数类型子类型与超类型示例解析
参考类型:F = { head : int, neck : int, toes : int list} -> { hands : int, feet : int}
函数子类型核心规则(参数逆变,返回协变):
若
P2 <: P1且R1 <: R2,则P1->R1 <: P2->R2
(注:A <: B表示A是B的子类型,即A的实例可替换B的实例)
一、参考类型的子类型示例
子类型S:{ head : int, neck : int} -> { hands : int, feet : int, fingers : int}
解析:
- 参数类型验证:
原参数类型P1 = { head : int, neck : int, toes : int list},子类型S的参数类型P3 = { head : int, neck : int}。
由于P1包含P3的所有字段,P1可替换P3的实例,即P1 <: P3,满足函数参数的逆变要求(函数子类型的参数需是原函数参数的超类型)。 - 返回类型验证:
原返回类型R1 = { hands : int, feet : int},子类型S的返回类型R3 = { hands : int, feet : int, fingers : int}。
由于R3包含R1的所有字段,R3可替换R1的实例,即R3 <: R1,满足函数返回的协变要求(函数子类型的返回需是原函数返回的子类型)。 - 综上,根据规则可得
S <: F,S是F的子类型。
二、参考类型的超类型示例
超类型T:{ head : int, neck : int, toes : int list, arms : int} -> { hands : int}
解析:
- 参数类型验证:
超类型T的参数类型P2 = { head : int, neck : int, toes : int list, arms : int},原参数类型P1 = { head : int, neck : int, toes : int list}。
由于P2包含P1的所有字段,P2可替换P1的实例,即P2 <: P1,满足函数参数的逆变要求(原函数的参数需是超类型参数的子类型)。 - 返回类型验证:
原返回类型R1 = { hands : int, feet : int},超类型T的返回类型R2 = { hands : int}。
由于R1包含R2的所有字段,R1可替换R2的实例,即R1 <: R2,满足函数返回的协变要求(原函数的返回需是超类型返回的子类型)。 - 综上,根据规则可得
F <: T,T是F的超类型。
内容的提问来源于stack exchange,提问作者Diane987
相关产品推荐
相关产品推荐

