или просто скинуть исключение на дубликаты ...

ыл довольно неприятный сюрприз:

scala> Set(1, 2, 3, 4, 5)       
res18: scala.collection.immutable.Set[Int] = Set(4, 5, 1, 2, 3)
scala> Set(1, 2, 3, 4, 5).toList
res25: List[Int] = List(5, 1, 2, 3, 4)

Пример сам по себе предлагает ответ «нет» на мой вопрос. Тогда как насчетListSet?

scala> import scala.collection.immutable.ListSet
scala> ListSet(1, 2, 3, 4, 5)
res21: scala.collection.immutable.ListSet[Int] = Set(1, 2, 3, 4, 5)

Кажется, это работает, но я должен полагаться на это поведение? Какая другая структура данных подходит для неизменной коллекции уникальных предметов, в которой должен быть сохранен первоначальный порядок?

Кстати, я знаю оdistict метод вList, Проблема в том, что я хочу обеспечить уникальность элементов (при сохранении порядка) на уровне интерфейса, поэтому используйтеdistinct испортит мой аккуратный дизайн ..

РЕДАКТИРОВАТЬ

ListSet тоже не кажется надежным:

scala> ListSet(1, 2, 3, 4, 5).toList
res28: List[Int] = List(5, 4, 3, 2, 1)

EDIT2

В поисках идеального дизайна я попробовал это:

scala> class MyList[A](list: List[A]) { val values = list.distinct }
scala> implicit def toMyList[A](l: List[A]) = new MyList(l)
scala> implicit def fromMyList[A](l: MyList[A]) = l.values     

Который на самом деле работает:

scala> val l1: MyList[Int] = List(1, 2, 3)
scala> l1.values
res0: List[Int] = List(1, 2, 3)

scala> val l2: List[Int] = new MyList(List(1, 2, 3))
l2: List[Int] = List(1, 2, 3)

Проблема, однако, в том, что я не хочу разоблачатьMyList вне библиотеки. Есть ли способ получить неявное преобразование при переопределении? Например:

trait T { def l: MyList[_] }
object O extends T { val l: MyList[_] = List(1, 2, 3) }
scala> O.l mkString(" ")  // Let's test the implicit conversion
res7: String = 1 2 3      

Я хотел бы сделать это так:

object O extends T { val l = List(1, 2, 3) }  // Doesn't work

Ответы на вопрос(3)

Ваш ответ на вопрос