加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 函数类型之间的子类型

发布时间:2020-12-16 18:51:10 所属栏目:安全 来源:网络整理
导读:在课程函数式编程课程中,我遇到了一个微妙的概念. 如果A2 :A1和B1 :B2,那么(A1 = B1):(A2 = B2) 理由 当我们将参数传递给A2并且由于子类型关系时,我们可以将相同的参数传递给A1. 然后应用函数A1 = B1 然后该函数给出B1并且因为子类型符合B2 如果我们为此
在课程函数式编程课程中,我遇到了一个微妙的概念.

如果A2 <:A1和B1 <:B2,那么(A1 => B1)<:(A2 => B2)

理由

>当我们将参数传递给A2并且由于子类型关系时,我们可以将相同的参数传递给A1.
>然后应用函数A1 => B1
>然后该函数给出B1并且因为子类型符合B2

如果我们为此画一个维恩图,

>图1

diagram 1


>图2

diagram 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(s:Set):Set
然后f2(s:Iterable):SortedSet是f1的子类型,因为它可以用来代替f1.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读