不是一个完整的答案,只是一些值得深思的东西:我试图构建一个反例,但在A
被推断为最窄类型的假设下,我无法提出任何实际上会导致不合理的东西. 不过,也许你觉得它很有趣。
这是一个h
具有类似约束的函数,但List
我们采用稍微不同的类型构造函数来代替 。
主要思想是Cc
有两个单独的类型参数:
- 首先是
_
in的意思F[_]
- 第二个是
A
在<: Lst[A]
-constraint中与之交互的那个
A
请注意,如果被推断为最窄的类型 ( ) ,则不会编译Nothing
:
(run in 3.0.0-RC2)
scala> trait Lst[+X]
// defined trait Lst
scala> case class Cc[+I, +X](i: I) extends Lst[X]
// defined case class Cc
scala> type T[+I] = Cc[I, Nothing]
// defined alias type T[+I] = Cc[I, Nothing]
scala> def h[F[_] <: Lst[A], A](as: F[A]) = as
def h[F[_$1] <: Lst[A], A](as: F[A]): F[A]
scala> val xs: T[Int] = Cc(42)
val xs: T[Int] = Cc(42)
scala> h(xs)
val res9: Cc[Int, Nothing] = Cc(42)
已A
被推断为满足 的约束的最窄的可能类型<: Lst[A]
,A
则将是Nothing
,并且参数必须T[Nothing] = Cc[Nothing, Nothing]
是无人居住的类型。
我认为这很有趣,但我不明白为什么如果它不编译它实际上会很糟糕。