Прохождение оператора Left в любом

Учитывая эти два метода, которые используют Either, во втором методе мне нужно передать ошибку, используя Left(error) => Left(error). Есть ли способ опустить это во втором методе (или использовать более элегантный код), поскольку оператор просто должен быть передан?

  trait Error
  case class ErrorClass (msg: String) extends Error

  def intFunction(i:Int) : Either[ErrorClass,Int] = {
    if (i>0)
        Right(i)
    else
        Left(ErrorClass("error"))
  }

  def multiplier(j:Int) : Either[ErrorClass,Int] = {
      val either = intFunction(2)
      either match {
        case Right(i) => Right(i*j)
        case Left(error) => Left(error)
      }
  }

person ps0604    schedule 08.03.2018    source источник


Ответы (1)


Начиная со scala 2.12, Either имеет правое смещение, что означает, что вы можете .map() поверх него, и функция будет применяться только в том случае, если это Right:

trait Error
case class ErrorClass(msg: String) extends Error

def intFunction(i: Int): Either[ErrorClass, Int] = {
  if (i > 0)
    Right(i)
  else
    Left(ErrorClass("error"))
}

def multiplier(i: Int, j: Int): Either[ErrorClass, Int] = {
  val either = intFunction(i)
  either.map(_ * j)
}

println(multiplier(10, 10))  // Right(100)
println(multiplier(-1, 10))  // Left(ErrorClass(error))

Если вы используете scala 2.11-, вам нужно быть явным и получить доступ к RightProjection перед сопоставлением с ним, поскольку Either не смещается вправо:

def multiplier(i: Int, j: Int): Either[ErrorClass, Int] = {
  val either = intFunction(i)
  either.right.map(_ * j)
}
person Marth    schedule 08.03.2018
comment
спасибо, выглядит хорошо, но я использую 2.11 и не могу обновиться, есть другие предложения? - person ps0604; 08.03.2018