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'来收集关于'我'的更多信息,所以它只是给它'任何',因为它不够智能)否则它被标记为"没什么"就像我们无话可说.但是,我不确定,仍然困惑.
| 归档时间: |
|
| 查看次数: |
124 次 |
| 最近记录: |