相关疑难解决方法(0)

存在型表达式的摩擦化

在Scala中,以下表达式引发类型错误:

val pair: (A => String, A) forSome { type A } = ( { a: Int => a.toString }, 19 )
pair._1(pair._2)
Run Code Online (Sandbox Code Playgroud)

正如SI-9899和这个答案中所提到的,根据规范,这是正确的:

我认为这是按照SLS 6.1的设计工作的:"以下skolemization规则适用于每个表达式:如果表达式的类型是存在类型T,那么表达式的类型将被假定为skolemization T."

但是,我不完全理解这一点.此规则适用于哪一点?它是否适用于第一行(即,类型pair与类型注释给出的类型不同),或者在第二行中应用(但将规则应用于第二行作为整体不会导致类型错误) ?

我们假设SLS 6.1适用于第一行.它应该skolemize存在的类型.我们可以通过将存在性放在类型参数中来使第一行中的非存在类型:

case class Wrap[T](x:T)
val wrap = Wrap(( { a: Int => a.toString }, 19 ) : (A => String, A) forSome { type A })
wrap.x._1(wrap.x._2)
Run Code Online (Sandbox Code Playgroud)

有用!(没有类型错误.)这意味着,当我们定义时,存在类型会"丢失" pair吗?没有:

val wrap2 = Wrap(pair)
wrap2.x._1(wrap2.x._2)
Run Code Online (Sandbox Code Playgroud)

这种类型检查!如果它是分配的"错误" pair,这应该不起作用.因此,它不起作用的原因在于第二行.如果是这样的话,那么wrap和pair例子有什么区别? …

scala existential-type

9
推荐指数
1
解决办法
285
查看次数

标签 统计

existential-type ×1

scala ×1