Почему Seq [V] не расширяет Map [Int, V] и Set [V] не расширяет Map [V, Bool]? - PullRequest
6 голосов
/ 05 января 2011

Три непосредственных подтипа Iterable: Map, Seq и Set.Кажется, что, помимо проблем с производительностью, Seq - это карта от целых чисел до значений, а Set - это карта от значений до логических значений (true, если значение в наборе, false в противном случае).

Если это так, то почему это не выражается в системе типов, заставляя Seq[V] extension Map[Int, V] и Set[V] extended Map[V, Boolean]?

Ответы [ 3 ]

12 голосов
/ 05 января 2011

Ну, они вроде как, по крайней мере, на самом деле обычная функциональность.Seq[B] наследуется от Int => B (через PartialFunction[Int, B]), Map[A, B] наследуется от A => B (также через PartialFunction[A, B]), а Set[A] наследуется от A => Boolean.Таким образом, что касается применения функций и методов композиции, все три могут использоваться взаимозаменяемо.Кроме того, они могут использоваться взаимозаменяемо, так как все они используют TraversableLike.

8 голосов
/ 05 января 2011

Просмотр последовательности как присваивания из целых чисел элементам - это только один способ описать, что такое последовательность.Существуют и другие способы, и нет никаких причин, по которым такой способ описания последовательности должен стать каноническим.Фактическая цель последовательности состоит в том, чтобы сделать группу элементов доступной и проходимой.Последовательность не требуется для фактического назначения целых чисел элементам.Например, большинство реализаций Stream, вероятно, не имеют счетчика, работающего параллельно обходу.Требование этого может привести к ненужным накладным расходам на реализацию.

Кроме того, Map[K,V] также является Iterable[(K,V)].Следуя вашему предложению, Seq[A] также должен был бы быть Map[Int,A], что также сделало бы его Iterable[(Int,A)].Поскольку Seq расширяет Iterable, это сделает Seq[A] одновременно Iterable[A] и Iterable[(Int,A)] (и, рекурсивно, Iterable[(Int,(Int,A))], Iterable[(Int,(Int,(Int,A)))] и т. Д.), Что недопустимоспособ наследования в Scala.

Вы можете составить аналогичный аргумент для своего предложения относительно Set.

4 голосов
/ 05 января 2011

Ну, если бы все вы заботились о Seq и Set было бы так, у вас был бы смысл.Я сам считаю, что это один из аспектов, имеющих наименьшее значение, и тот, который уже хорошо представлен всеми из них, является функциями .

То есть Map является функциейключа в значение, Seq - это функция от Int в значении, а Set - это функция от значения в Boolean.Это свойство, которое вы назвали «картой», является функцией.И это уже разделяют все три.

Что, на мой взгляд, Map, Seq и Set на самом деле о:

  • ASeq касается знания того, в каком порядке находятся его элементы.Концептуально, как бы вы добавили элемент в Map?Вам придется перенумеровать все ключи!

  • A Set обеспокоен наличием или отсутствием элемента.Как можно смоделировать это в Map?Это должна быть карта со значением по умолчанию, а не общая карта, в которой все значения, отличные от значений по умолчанию, одинаковы!Это явно вырожденное поведение, а не абстракция.

  • A Map касается отображения произвольных ключей в произвольные значения.У Seq нет произвольных ключей, а у Set нет произвольных значений.

...