未定义的抽象类型成员和存在类型之间的区别
Difference between an undefined abstract type member and an existential type
给定一个未初始化的抽象类型成员=:=
等于一个存在类型
implicitly[Undefined =:= x forSome { type x }] // ok
那为什么他们之间似乎有区别
object O {
type Undefined
implicitly[Undefined =:= _] // ok
def g[F[_]](fun: F[_] => F[_]) = ???
def h[F[_]](fun: F[Undefined] => F[Undefined]) = ???
g[List](l => List(42)) // ok
h[List](l => List(42)) // error
}
注意 g
编译时 h
引发类型不匹配错误的方式。此外考虑
object O {
type Undefined
type Existential = x forSome { type x }
implicitly[Undefined =:= x forSome { type x }] // ok
implicitly[Undefined =:= Existential] // error
}
如果Undefined
等于x forSome { type x }
,而x forSome { type x }
等于Existential
,那么为什么Undefined
不等于Existential
?
你漏掉了括号:
implicitly[Undefined =:= (x forSome { type x })]
所以编译不了。
它们之间应该是有区别的。他们是不同的。
implicitly[Undefined <:< (x forSome { type x })]
反之则不然。
实际上 x forSome { type x }
只是 Any
.
What is the meaning of implicitly[Undefined =:= _]
?
implicitly[Undefined =:= _]
是 implicitly[(Undefined =:= x) forSome {type x}]
。
并且 Undefined =:= x
对于某些 x
是正确的。即对于Undefined
.
给定一个未初始化的抽象类型成员=:=
等于一个存在类型
implicitly[Undefined =:= x forSome { type x }] // ok
那为什么他们之间似乎有区别
object O {
type Undefined
implicitly[Undefined =:= _] // ok
def g[F[_]](fun: F[_] => F[_]) = ???
def h[F[_]](fun: F[Undefined] => F[Undefined]) = ???
g[List](l => List(42)) // ok
h[List](l => List(42)) // error
}
注意 g
编译时 h
引发类型不匹配错误的方式。此外考虑
object O {
type Undefined
type Existential = x forSome { type x }
implicitly[Undefined =:= x forSome { type x }] // ok
implicitly[Undefined =:= Existential] // error
}
如果Undefined
等于x forSome { type x }
,而x forSome { type x }
等于Existential
,那么为什么Undefined
不等于Existential
?
你漏掉了括号:
implicitly[Undefined =:= (x forSome { type x })]
所以编译不了。
它们之间应该是有区别的。他们是不同的。
implicitly[Undefined <:< (x forSome { type x })]
反之则不然。
实际上 x forSome { type x }
只是 Any
.
What is the meaning of
implicitly[Undefined =:= _]
?
implicitly[Undefined =:= _]
是 implicitly[(Undefined =:= x) forSome {type x}]
。
并且 Undefined =:= x
对于某些 x
是正确的。即对于Undefined
.