Scala 具有路径相关值类型的映射?
我知道Scala有路径依赖类型,因此,例如,如果我在一个内部类中有一个类,我可以将一个方法的一个参数约束为另一个参数的内部类的实例:Scala 具有路径相关值类型的映射?,scala,map,path-dependent-type,Scala,Map,Path Dependent Type,我知道Scala有路径依赖类型,因此,例如,如果我在一个内部类中有一个类,我可以将一个方法的一个参数约束为另一个参数的内部类的实例: class Outer { class Inner( x:Int ) } val o1 = new Outer val o2 = new Outer val i11 = new o1.Inner(11) val i12 = new o1.Inner(12) val i21 = new o2.Inner(21) def f[ A <: Outer ]( a:A
class Outer { class Inner( x:Int ) }
val o1 = new Outer
val o2 = new Outer
val i11 = new o1.Inner(11)
val i12 = new o1.Inner(12)
val i21 = new o2.Inner(21)
def f[ A <: Outer ]( a:A )( i:a.Inner ) = (a,i)
f(o1)(i11) // works
f(o1)(i21) // type mismatch; i21 is from o2, not o1
但这将允许像o1->i21
这样的条目,我不希望这样的条目被允许。是否有任何类型的魔法要求值是其键的内部类的实例?也就是说,我想说
var m = Map[Outer,$1.Inner]() // this doesn't work, of course
没有
路径相关类型的作用域为对象实例,如您给出的示例所示:
def f[ A <: Outer ]( a:A )( i:a.Inner ) = (a,i)
在定义B
时,此处范围内没有类型为A
的对象可供参考
正如其他人所暗示的,您可以定义一个新的类似映射类来满足此要求:
trait Map2[A <: Outer] {
def get(key: A): Option[key.Inner]
def put(key: A)(value: key.Inner): this.type
}
trait Map2[A您表述问题的方式:“要求值是键的内部类的实例”已经描述了您的var m=Map[Outer,Outer#inner]()
用这样的类型投影定义地图需要值是某个外部的内部实例,而不是用于它们键的外部实例。def g[a我认为类型系统在这方面帮不了你(除非你采用类似Shapeless的HMap
),但您始终可以监控添加到映射中的内容。您需要一个新的、更受约束的映射
类型或Scala中的任意依赖类型。前者可以作为现有映射
的安全包装器编写。基本上,您只能通过键类型对其进行参数化,并且约束键具有一些命名的内部类型pe,然后您的访问器方法将具有像def get(k:k)这样的类型:k.Inner
。它不会实现当前的Scala集合通用地图特性。Travis和Dan实际上在将近一年半前通过评论为我回答了这个问题,但对于未来的读者来说,有一个更清楚地解释问题的实际答案是很好的,所以我接受这个答案,Rich。
trait Map[A,+B] {
def get(key: A): Option[B]
def + [B1 >: B](kv: (A, B1)): This
}
trait Map2[A <: Outer] {
def get(key: A): Option[key.Inner]
def put(key: A)(value: key.Inner): this.type
}