Scala类型推断混淆:任何或没有?

che*_*ong 5 scala type-inference intellij-idea

原始版本:

  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
    }
  }
Run Code Online (Sandbox Code Playgroud)

修改版本:

  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
    }
  }
Run Code Online (Sandbox Code Playgroud)

如果F是List,原始版本的函数混淆将被推断为Any => A type.修改后的版本将被推断为Nothing => A type作为默认值.为什么不是它们都是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] 
Run Code Online (Sandbox Code Playgroud)

似乎一旦我们在这里有类型'I'的约束(类型构造函数)'Trampoline',我们就可以说'我'喜欢类型'我'拥有'F'的属性(它可以是任何类型构造函数? ),因此它将被Scala编译器推断为"任何"(它没有进一步检查类型构造函数'F'来收集关于'我'的更多信息,所以它只是给它'任何',因为它不够智能)否则它被标记为"没什么"就像我们无话可说.但是,我不确定,仍然困惑.