原始版本:
trait Animal[F[_], A]
case class Cat[F[_], I, A](limits: F[I], f: I => A) extends Animal[F,A]
object ConfuseMe {
def confuse[F[_], A](tt: Animal[F, A]) = tt match {
case Cat(_, f) => f
}
}
修改版本:
trait Animal[A]
case class Cat[I, A](f: I => A) extends Animal[A]
object ConfuseMe {
def confuse[A](tt: Animal[A]) = tt match {
case Cat(f) => f
}
}
如果F是List,原始版本的函数混淆将被推断为Any => A类型。默认情况下,修改后的版本将被推断为 Nothing => A 类型。为什么它们不都是 IntelliJ IDE 所暗示的 Nothing => A 类型?我完全糊涂了。
其他有趣的例子:
trait Trampoline[+A]
case class Done[+A](get: A) extends Trampoline[A]
case class More[+A](force: () => Trampoline[A]) extends Trampoline[A]
case class Bind[I,+A](force: () => Trampoline[I], f: I => Trampoline[A]) extends Trampoline[A]
似乎一旦我们在这里对类型“I”有了约束(类型构造函数)“Trampoline”,我们就有话要说“I”,就像类型“I”具有“F”属性(它可以是任何类型构造函数? ),所以它会被 Scala 编译器推断为“Any”(它不会进一步类型检查类型构造函数“F”来收集有关“I”的更多信息,因此它只是给它“Any”,因为它不够智能)否则它就会被标记为“没什么”,就像我们无话可说一样。然而,我对此并不确定,仍然陷入困惑。