0

在 Scala “4.5 Variance”中的函数式编程原理的这段视频中,您可以看到一张幻灯片,上面写着:

翻译

假设您有两种函数类型:

type A = IntSet => NonEmpty
type B = NonEmtpy => IntSet

根据里氏替换原则,下列哪项应该是正确的?

  • A <: B(选中)
  • B <: A
  • A并且B是无关的。

视频声明类型A是 type 的子类型B;但是,它确实是这么说的,

类型 A 满足与类型 B 相同的合同,如果你给它一个 NonEmpty 集,它会给你一个 IntSet,但它实际上会满足比 B 更多

但这不是真的,B 包含 NonEmpty 集,其中包含的不仅仅是IntSet。这个视频是不是直接不正确和混乱?

4

1 回答 1

1

我认为它是隐含的(可能在上一课中提到过?)NonEmptyIntSet. 根据 Odersky 的说法,听起来像是sNonEmpty的子集IntSet不为空。所以A接受比实际更多的参数值B,并返回一个比它更窄的值子B集,一个具有附加属性的子集。

于 2021-04-25T22:39:35.437 回答