(A-> B)/ \(C-> D)是(A / \ C)->(B / \ D)的子类型吗?
仅出于->变数的考虑,似乎不应该这样做,但我找不到很好的反例。
如果是,该如何得出呢?
如果没有,反例是什么?
(为澄清起见,我在这里使用/ \作为交集。)
答案 0 :(得分:2)
这些类型属于子类型关系,正是由于 的逆差。联合将是A和C的超类型,因此将违反协变性。
调用函数的子类型化规则,这在域类型中是相反的:
T→U <:T'→U'iff T'<:T和U <:U'
对于相交类型,您还对箭头类型有一个分配规则:
(T→U)∧(T→V)= T→(U∧V)
当然,我们对交点类型有通常的消除规则:
T∧U <:T
T∧U <:U
将这四个规则放在一起,您可以轻松得出您要询问的子类型:
(A→B)∧(C→D)
<:(通过逆和左消除)
((A∧C)→B)∧(C→D)
<:(通过矛盾和权利消除)
((A∧C)→B)∧((A∧C)→D)
<:(按分布)
(A∧C)→(B∧D)
FWIW,具有联合类型,您还具有双重分配规则:
(U→T)∨(V→T)=(U∨V)→T
这样,您可以类似地得出:
(A→B)∨(C→D)<:(A∨C)→(B∨D)