是 (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)
(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)