在Either中传递Left语句

时间:2018-03-08 19:14:26

标签: scala either

鉴于这两种使用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)
      }
  }

1 个答案:

答案 0 :(得分: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)
}