在coursera函数式编程课程中,我遇到了一个微妙的概念。函数类型之间的子类型
如果A2 <:A1和B1 <:B2,然后(A1 => B1)<:(A2 => B2)
正当性
- 时我们将一个参数传递给A2,并且由于子类型关系,我们可以将相同的参数传递给A1。
- 然后应用功能A1 => B1
- 然后该函数给出B1和因为亚型如果我们绘制该维恩图,其有资格作为B2
的,
由于
在coursera函数式编程课程中,我遇到了一个微妙的概念。函数类型之间的子类型
如果A2 <:A1和B1 <:B2,然后(A1 => B1)<:(A2 => B2)
正当性
的,
由于
让我们对于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
。由于SortedSet
是Set
的子类型,因此也是如此。