函数类型之间的子类型化
Subtyping between function types
在coursera函数式编程课程中,我遇到了一个微妙的概念。
如果 A2 <: A1 且 B1 <: B2,则 (A1 => B1) <: (A2 => B2)
理由
- 当我们将参数传递给 A2 时,由于子类型关系,我们可以将相同的参数传递给 A1。
- 然后应用函数 A1 => B1
- 然后该函数给出 B1 并且由于子类型符合 B2
如果我们为此绘制维恩图,
图表 1
图表 2
- 哪个是正确的图表?
- 如何使用维恩图解释结果?
谢谢
让我们为 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
。由于 SortedSet
是 Set
的子类型,因此也是如此。
在coursera函数式编程课程中,我遇到了一个微妙的概念。
如果 A2 <: A1 且 B1 <: B2,则 (A1 => B1) <: (A2 => B2)
理由
- 当我们将参数传递给 A2 时,由于子类型关系,我们可以将相同的参数传递给 A1。
- 然后应用函数 A1 => B1
- 然后该函数给出 B1 并且由于子类型符合 B2
如果我们为此绘制维恩图,
图表 1
图表 2
- 哪个是正确的图表?
- 如何使用维恩图解释结果?
谢谢
让我们为 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
。由于 SortedSet
是 Set
的子类型,因此也是如此。