Scala 路径相关参数类型未强制(?)
在REPL上尝试:Scala 路径相关参数类型未强制(?),scala,path-dependent-type,Scala,Path Dependent Type,在REPL上尝试: class Outter { type Inner = Either[Int, String] def f(x: this.Inner) = 1 } val o = new Outter val someLeft = Left(1) o.f(someLeft) 这让我非常困惑,因为Outter.f()有一个显式的路径依赖类型参数(x:this.internal),这意味着只允许那些左Lefts(或右Rights)是o.internal的子类型,而不仅仅是任何Le
class Outter {
type Inner = Either[Int, String]
def f(x: this.Inner) = 1
}
val o = new Outter
val someLeft = Left(1)
o.f(someLeft)
这让我非常困惑,因为Outter.f()
有一个显式的路径依赖类型参数(x:this.internal
),这意味着只允许那些左Left
s(或右Right
s)是o.internal
的子类型,而不仅仅是任何Left[Int,
或Right[Int,
。我希望看到一个类型不匹配错误:
必需o.Inner
,找到左[Int,Nothing]
但它编译得很好!我(严重)遗漏了什么?type internal=或者[Int,String]
只是一个类型别名。这是预期的行为
只允许那些属于o.Inner
的(子类型)的左(或右),而不仅仅是任何Left[Int,
或Right[Int,
只有一个Left
类和一个Right
类。没有任何Left
s或Right
s仅是o.Inner
的子类型,而没有其他类型。创建类型别名不会创建仅属于类Outter
的新类型。Outter
唯一独特的是别名internal
,但是other
是相同的scala.util。other
type internal=other[Int,String]
只是一个类型别名。这是预期的行为
只允许那些属于o.Inner
的(子类型)的左(或右),而不仅仅是任何Left[Int,
或Right[Int,
只有一个Left
类和一个Right
类。没有任何Left
s或Right
s仅是o.Inner
的子类型,而没有其他类型。创建类型别名不会创建仅属于类Outter
的新类型。Outter
唯一独特的是别名internal
,但是other
是相同的scala.util。other
也可以,也可以查看(原始)相关问题,也可以查看后续内容,也可以查看(原始)相关问题,看到后续内容了吗?没有办法从已经定义的类型创建路径依赖的类型?我相信我已经严重偏离了这里的图表:不完全正确。您是否可以尝试包装这些类型?我不知道你为什么想要这样的东西。我的印象是,类型
别名可以让我省去(重新)实现依赖于封闭值(即路径依赖)的或的麻烦。现在我明白了type
只是一个别名=与封闭对象无关。那么,我如何实现“包装”呢?由于other
是密封的…为什么不创建一个包含othercase类Inner(Inner:other[Int,String])
的case类呢?那么就没有办法从已经定义的类型创建路径依赖的类型了?我相信我在这里已经严重偏离了图表:不完全正确。您是否可以尝试包装这些类型?我不知道你为什么想要这样的东西。我的印象是,类型
别名可以让我省去(重新)实现依赖于封闭值(即路径依赖)的或的麻烦。现在我明白了type
只是一个别名=与封闭对象无关。那么,我如何实现“包装”呢?由于or
是密封的……为什么不创建一个包含orcase类内部(内部:or[Int,String])的case类呢
scala> :load Learn.scala
Loading Learn.scala...
defined class Outter
o: Outter = Outter@28037ced
someLeft: scala.util.Left[Int,Nothing] = Left(1)
res0: Int = 1