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

我知道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 )( 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
}