函数类型之间的子类型化

Subtyping between function types

在coursera函数式编程课程中,我遇到了一个微妙的概念。

如果 A2 <: A1B1 <: B2,则 (A1 => B1) <: (A2 => B2)

理由

如果我们为此绘制维恩图,

参考:Youtube video

谢谢

让我们为 F1 调用 (A1 => B1),为 F2 调用 (A2 => B2)

要使函数 F1 成为另一个函数 F2 的子类型,我们需要类型系统接受它来代替 F2。

您可以将参数 A 的任何子类型传递给接受 A 但不接受超类型的函数。这意味着,要使 F1 成为 F2 的子类型,它必须至少接受 F2 接受的所有参数,因此 A1 必须是 A2 的超类型。

另一方面,F1 的输出必须至少与 F2 的输出一样详细,以便可以在任何可以使用 F2 的输出的地方使用。这意味着 B1 必须是 B2 的子类型。

我不确定图表是否是可视化它们如何组合在一起的好方法,但我要说的是,在这两者中,图表 1 是最准确的。

我们来看一个例子: 假设你有函数 f1(s: Set): Set 那么 f2(s: Iterable): SortedSet 是 f1 的子类型,因为它可以用来代替 f1。

f1 要求其参数为 Set 类型或 Set 的任何子类型。所有这些参数在 f2 中也有效。 f1 的输出是 Set,因此 f2 的输出必须可以用作 Set。由于 SortedSetSet 的子类型,因此也是如此。