I am trying to match the case where a Seq
contains Nothing
.
models.Tasks.myTasks(idUser.toInt) match {
case tasks => tasks.map {
task => /* code here */
}
case _ => "" //matches Seq(models.Tasks)
}
How is Seq[Nothing]
represented in pattern matching ?
Matching against an empty sequence looks like this:
val x: Seq[Nothing] = Vector()
x match {
case Seq() => println("empty sequence")
}
EDIT: Note that this is more general than case Nil
since Nil
is a subclass only of List
, not Seq
in general. Strangely, the compiler is ok with matching against Nil
if the type is explicitly annotated as Seq
, but it will complain if the type is any non-List
subclass of Seq
. Thus you can do this:
(Vector(): Seq[Int]) match { case Nil => "match" case _ => "no" }
but not this (fails with compile-time error):
Vector() match { case Nil => "match" case _ => "no" }
Assuming I understand what you mean correctly, a sequence that contains nothing is empty, which is Nil
:
case Nil => //do thing for empty seq
This works even though you're dealing with Seq
s, not Lists
:
scala> Seq()
res0: Seq[Nothing] = List()
scala> Seq() == Nil
res1: Boolean = true
Some more REPL output to show that this works absolutely fine with other subclasses of Seq
:
scala> Nil
res3: scala.collection.immutable.Nil.type = List()
scala> val x: Seq[Int] = Vector()
x: Seq[Int] = Vector()
scala> x == Nil
res4: Boolean = true
scala> x match { case Nil => "it's nil" }
res5: java.lang.String = it's nil
scala> val x: Seq[Int] = Vector(1)
x: Seq[Int] = Vector(1)
scala> x match { case Nil => "it's nil"; case _ => "it's not nil" }
res6: java.lang.String = it's not nil
As can be seen from the above output, Nil
is a type all of it's own. This question has some interesting things to say on the matter.
But @dhg is correct that if you manually create a specific subtype such as vector, the match does not work:
scala> val x = Vector()
x: scala.collection.immutable.Vector[Nothing] = Vector()
scala> x match { case Nil => "yes"}
<console>:9: error: pattern type is incompatible with expected type;
found : object Nil
required: scala.collection.immutable.Vector[Nothing]
x match { case Nil => "yes"}
Having said that, I don't know why you would need to force your objects to be a referred to as a specific concrete subclass very often.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With