scala - 未定义的抽象类型成员和存在类型之间的区别
问题描述
给定一个未初始化的抽象类型成员=:=
等于一个存在类型
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
。
是什么意思
implicitly[Undefined =:= _]
?
implicitly[Undefined =:= _]
是implicitly[(Undefined =:= x) forSome {type x}]
。
对某些人Undefined =:= x
来说是正确的。x
即对于Undefined
.
推荐阅读
- iis - phpmyadmin sql 选项卡无法正常工作
- gitlab - Is there a way to upload GitLab CI artifacts to an Openshift container?
- build - Visual Studio Code 中的 Visual Studio 配置管理器的等价物是什么?
- bash - 如何从文件中获取第 n 行并将结果保存到变量中
- ssh - SSH - 用标题分隔 grep 结果
- java - 将批处理数据存储在 NoSQL 数据库中,而不是 WildFly 上 Jberet 中的文件系统中
- javascript - 将两个整数数组添加到数组数组中,以便创建坐标对
- javascript - Jest 无法解析带有 @ (at) 字符的导入
- algorithm - 计算三角函数、对数或类似的算法。只有加减法
- python - 在一系列列表中重新分配字符串值