2016-12-12 60 views
6

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

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

正当性

  • 时我们将一个参数传递给A2,并且由于子类型关系,我们可以将相同的参数传递给A1。
  • 然后应用功能A1 => B1
  • 然后该函数给出B1和因为亚型如果我们绘制该维恩图,其有资格作为B2

的,

  • 图1 diagram 1

  • 图2 diagram 2

    • 这是正确的图吗?
    • 如何用维恩图解释结果?

参考:Youtube video

由于

回答

4

让我们对于F2

呼叫(A1 => B1)为F1和(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的子类型,因此也是如此。