Suppose I need to convert Option[Int]
to Either[String, Int]
in Scala. I'd like to do it like this:
def foo(ox: Option[Int]): Either[String, Int] =
ox.fold(Left("No number")) {x => Right(x)}
Unfortunately the code above doesn't compile and I need to add type Either[String, Int]
explicitly:
ox.fold(Left("No number"): Either[String, Int]) { x => Right(x) }
Is it possible to convert Option
to Either
this way without adding the type ?
How would you suggest convert Option
to Either
?
No, if you do it this way, you can't leave out the type.
The type of Left("No number")
is inferred to be Either[String, Nothing]
. From just Left("No number")
the compiler can't know that you want the second type of the Either
to be Int
, and type inference doesn't go so far that the compiler will look at the whole method and decide it should be Either[String, Int]
.
You could do this in a number of different ways. For example with pattern matching:
def foo(ox: Option[Int]): Either[String, Int] = ox match {
case Some(x) => Right(x)
case None => Left("No number")
}
Or with an if
expression:
def foo(ox: Option[Int]): Either[String, Int] =
if (ox.isDefined) Right(ox.get) else Left("No number")
Or with Either.cond
:
def foo(ox: Option[Int]): Either[String, Int] =
Either.cond(ox.isDefined, ox.get, "No number")