是 (A -> B) /\ (C -> D) <: (A /\ C) -> (B /\ D)?

Is (A -> B) /\ (C -> D) <: (A /\ C) -> (B /\ D)?

(A -> B) /\ (C -> D) 是 (A /\ C) -> (B /\ D) 的子类型吗?

好像不应该,只是因为 -> 是逆变的,但我找不到好的反例。

如果是,我如何得出这个?

如果不是,反例是什么?

(为了澄清,我在这里使用 /\ 作为交集。)

这些类型是子类型关系,正是因为逆变。联合将是 A 和 C 的超类型,因此会违反逆变。

回忆一下函数的子类型化规则,它在域类型中是逆变的:

T → U <: T' → U' 当且仅当 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)