gpt4 book ai didi

scala - 不变类实例列表的 LUB

转载 作者:行者123 更新时间:2023-12-02 01:21:17 25 4
gpt4 key购买 nike

给定一个具有协变类型参数的类:

scala> class G[+A]
defined class G

以下列表显示了 List[G[Any]] 的最小上限。

scala> List(new G[Int], new G[String])
res1: List[G[Any]] = List(G@5aa360ea, G@6548bb7d)

然后,给定一个具有invariant 类型参数的类:

scala> class F[A]
defined class F

我看到了 List[F[_ >: String with Int]] 的最小上限 (LUB)。

scala> List(new F[Int], new F[String])
res0: List[F[_ >: String with Int]] = List(F@6c4980d3, F@327bcebd)

一个更简单的示例显示了 List[Any] 的 LUB:

scala> List( (42 : Int), "foobar" )
res2: List[Any] = List(42, foobar)

请解释 FList 的 LUB。

最佳答案

G在其类型参数 A协变 .这意味着给定任何类型 AB , 如果 AG子类型 , 然后 G[A]G[B]子类型 .让我们使用 A <:< B 来简写表示AB子类型 , 然后 G[A] <:< G[B] .

这意味着当我们有一个 List(new G[Int], new G[String]) , 允许编译器将其推断为 List[Any] ,因为 List[G[Int]] <:< List[G[Any]]List[G[String]] <:< List[G[Any]] (因为 List 在其类型参数上也是协变的)。

您可能已经知道这一点,但值得为那些还不知道的人解释一下。

F在其类型参数上不变 A ,所以我们不能做出相同的推论。好的,那么 List(new F[Int], new F[String]) 的类型是什么? ?因为F不变,我们不能说F[Int] <:< F[Any]或者那个F[String] <:< F[Any] (因为这不是真的!)。所以它不是 List[F[Any]].

那么编译器可以推断出什么呢?唯一真正的选择是某种存在类型,因为它不可能是 Any , 或 String with Int ,或其他任何不破坏协方差的东西。由于它正在寻找最小上界,因此它推断出一个存在类型,该类型受所包含类型的复合限制(在 F 中)。即 _ >: String with Int某种无名类型,其下界String with Int .

或者,换句话说,我们知道我们有一个 ListF s,但我们不知道它们每个包含什么类型。只有任何给定的 FList是一个 F[Int] , 或 F[String] ,仅此而已。

关于scala - 不变类实例列表的 LUB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40094552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com