Um ursprünglichen Repr
Art zu erholen, können Sie self.repr
(scaladoc)
implicit class CollectionExtensions[A, Repr](self: TraversableLike[A, Repr]){
def toOption: Option[Repr] = if (self.nonEmpty) Some(self.repr) else None
}
verwenden Wenn Sie nur mit Option[TraversableLike[A, Repr]]
wie @ chengpohi halten würde die Antwort schon sagt, Operationen wie map
darauf (list.toOption.map(_.map(x => x))
) würden Sie zurückkehren Option[Traversable[T]]
Verlust der ursprünglichen Repr
Art (wie List[Int]
). repr
hilft mit, dass:
def repr: Repr
Die Sammlung von Typ verfahrbaren Sammlung dieses TraversableLike Objekt zugrunde liegt. Standardmäßig ist dies als das TraversableLike-Objekt selbst implementiert, aber dies kann überschrieben werden.
jedoch das Komische ist, wenn man sich repr
‚s Code aussehen (here):
def repr: Repr = this.asInstanceOf[Repr]
Es tut gleiche Sache, aber zumindest wickelte es (versteckt?) Schön in scala-library und abstrakter, so könnten Sie potenzielle Neudefinitionen berücksichtigen.
Auch ist es erwähnenswert, dass diese nicht mit leerer Sammlung Ansatz in scalaz/Katzen beliebt ist:
scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._
scala> List(1, 2, 3).toNel
res8: Option[scalaz.NonEmptyList[Int]] = Some(NonEmptyList(1, 2, 3))
scala> nil[Int].toNel
res9: Option[scalaz.NonEmptyList[Int]] = None
toNel
bedeutet hier toNonEmptyList
, es ist also nicht so abstrakt, wie Ihre Lösung. Katzen haben OneAnd[A,Repr]
und einige hilfreiche implicits. Siehe http://typelevel.org/cats/datatypes/oneand.html