Scala类型推断混乱:什么都没有?

时间:2018-08-22 20:28:43

标签: scala intellij-idea type-inference

原始版本:

  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”是因为它不是足够聪明),否则它会被标记为“无”,就像我们无话可说。但是,我不确定,仍然陷入困惑。

0 个答案:

没有答案