Какие типы данных в Прологе?

Библиотека коллекций Scala предоставляет специализированные реализации для наборов из менее 5 значений (см. источник ). Итераторы для этих реализаций возвращают элементы в том порядке, в котором они были добавлены , а не в согласованном порядке на основе хешей, используемом для больших наборов.

Кроме того, sameElements ( scaladoc ) определен на Iterable s (он реализован в IterableLike - см. источник ); он возвращает true, только если итераторы возвращают одни и те же элементы в одном порядке.

Итак, хотя Set(1,2,3) и Set(3,2,1) должны быть эквивалентными, их итераторы различны, поэтому sameElements возвращает false.

Такое поведение является неожиданным и, возможно, является ошибкой, поскольку оно нарушает математические ожидания для Set (но только для определенных размеров Set!).

As И.К. указывает на комментарии, == отлично работает, если вы просто сравниваете Sets друг с другом, то есть Set(1,2,3) == Set(3,2,1). Однако sameElements является более общим в том смысле, что он может сравнивать элементы любых двух итераций. Например, List(1, 2, 3) == Array(1, 2, 3) является ложным, но List(1, 2, 3) sameElements Array(1, 2, 3) является истинным.

В более общем плане, равенство может сбивать с толку - обратите внимание, что:

List(1,2,3) == Vector(1,2,3)
List(1,2,3) != Set(1,2,3)
List(1,2,3) != Array(1,2,3)      
Array(1,2,3) != Array(1,2,3)

У меня есть отправлено fix для упражнений Scala , которые объясняют проблему sameElements.

13
задан josh 20 August 2012 в 23:50
поделиться