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)