scala – 函数类型之间的子类型
在课程函数式编程课程中,我遇到了一个微妙的概念.
如果A2 <:A1和B1 <:B2,那么(A1 => B1)<:(A2 => B2) 理由 >当我们将参数传递给A2并且由于子类型关系时,我们可以将相同的参数传递给A1. 如果我们为此画一个维恩图, >图1 >图2 >这是正确的图表? 参考: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要求其参数为Set类型或Set的任何子类型.所有这些参数在f2中也是有效的.f1的输出是Set,因此f2的输出必须可用作Set.由于SortedSet是Set的子类型,因此也是如此. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |