原始版本:
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拥有约束(类型构造函数)“蹦床”,我们就可以说一些关于“ I”的信息,例如类型“ I”具有“ F”的属性(它可以是任何类型-constructor?),因此它会被Scala编译器推断为“ Any”(它不会进一步进行类型检查类型构造器“ F”来收集有关“ I”的更多信息,因此只给它“ Any”是因为它不是足够聪明),否则它会被标记为“无”,就像我们无话可说。但是,我不确定,仍然陷入困惑。