Scala 'F[\<;:A]<;'之间的类比:B`在类型级别,f:A=>;B`在价值层面

Scala 'F[\<;:A]<;'之间的类比:B`在类型级别,f:A=>;B`在价值层面,scala,scala-3,type-constructor,Scala,Scala 3,Type Constructor,假设F首先,关于类型lambda的推断,我认为类型推断不会达到仅仅为了满足约束条件而产生类型lambda的程度,否则从直觉上看,一切基本上都可以使用一些复杂的类型lambda进行类型检查,这在发现类型错误时不会有用 至于为什么f[List,Int](List(42))无法编译(因此无法推断),我们需要参考lambdas的类型: 假设有两种类型的lambdas 类型TL1=[X>:L1>R1 类型TL2=[X>:L2>R2 然后TL1.Scala不够聪明,无法从其参数的边界推断出F[uz]的边界

假设
F首先,关于类型lambda的推断,我认为类型推断不会达到仅仅为了满足约束条件而产生类型lambda的程度,否则从直觉上看,一切基本上都可以使用一些复杂的类型lambda进行类型检查,这在发现类型错误时不会有用

至于为什么
f[List,Int](List(42))
无法编译(因此无法推断),我们需要参考lambdas的类型:

假设有两种类型的lambdas

类型TL1=[X>:L1>R1
类型TL2=[X>:L2>R2

然后
TL1.Scala不够聪明,无法从其参数的边界推断出F[uz]的边界,这是不幸的(甚至可能是一个bug)。@MarioGalic@HTNW不正确
type N[X和
type N[X,在协变位置上,您可以缩小:
type N[X@HTNW,同样在上一个示例中,`//in g,F[a]当A=Int不必是List[Int]g[N,Int](Nil):List[Nothing]``但是
List[Nothing]
是一个
List[Int]
,因为
Nothing
是所有类型的子类型,
List
是协变的。Scala 2等价于
f[[\u>List[Int],Int](List(42))
kind
f[λ[]List[Int]],Int](列表(42))
。不带
类型投影仪
f[({typeλ)[_
$ scala3-repl
scala> def f[F[_ <: Int] <: List[Int], A <: Int](as: F[A]) = as
def f[F[_$1] <: List[Int], A <: Int](as: F[A]): F[A]

scala> f(List(42))
1 |f(List(42))
  |  ^^^^^^^^
  |Found:    List[Int]
  |Required: F[A]
  |
  |where:    A is a type variable with constraint <: Int
  |          F is a type variable with constraint <: [_$1 <: Int] =>> List[Int]
scala> f[[_ <: Int] =>> List[Int], Int](List(42))
val res0: List[Int] = List(42)