为什么Seq [V]不扩展Map [Int,V],Set [V]也不扩展Map [V,Bool]?

Ada*_*dam 6 oop scala subclass

的三个直接亚型IterableMap,SeqSet.看起来,除了性能问题,一个Seq是整数的地图值,并且Set是从值的地图,布尔值(true,如果值是设定,否则为false).

如果是这种情况,为什么不通过Seq[V]扩展Map[Int, V]Set[V]扩展在类型系统中表达Map[V, Boolean]

Dav*_*ith 12

嗯,他们有点做,至少实际上是常见的功能.Seq[B]继承自Int => B(via PartialFunction[Int, B]),Map[A, B]继承自A => B(也通过PartialFunction[A, B]),并Set[A]继承自A => Boolean.因此,就功能应用和组合方法而言,所有三种都可以互换使用.另外,就所有实现而言,就遍历而言,它们可以互换使用TraversableLike.


Mad*_*doc 8

将序列视为从整数到元素的赋值只是描述序列是什么的一种方式.还有其他方法,没有理由说这种描述序列的方式应该成为规范.序列的实际目的是使一堆元素可访问和遍历.不需要序列来实际为元素分配整数.例如,大多数Stream实现可能没有与遍历并行运行的计数器.要求这将对实施施加不必要的开销.

此外,一个Map[K,V]也是一个Iterable[(K,V)].根据你的建议,a Seq[A]也必须是a Map[Int,A],这也是一个Iterable[(Int,A)].自Seq扩展以来Iterable,这将使得Seq[A]an Iterable[A]和an Iterable[(Int,A)](以及递归地,an Iterable[(Int,(Int,A))],Iterable[(Int,(Int,(Int,A)))]等等),这不是Scala中允许的继承方式.

你可以为你的建议构建一个类似的论点Set.

  • 我认为第二个论点是引人注目的.为了简化它,如果`Seq [A]`扩展`Map [Int,A]`,`seq.elements()`会返回什么? (2认同)