Выполните одно из
- Объявите его явно как
Either[X, Y]
. - Объявите его как
MaybeResult[Y]
(для type MaybeResult[A] = Either[Failure, A]
)
Честно говоря, даже тогда я бы объявил об этом явно.Преимущество # 2 (по сравнению с вашим предложением) состоит в том, что со стандартным типом Failure
(возможно, Exception
или List[String]
) вы не должны объявлять отдельные псевдонимы типов для всех, где вы хотите
Преимущество использования Either
состоит в том, что 100% ясно для пользователя API, что происходит.Тем не менее, я бы сделал еще один шаг и использовал бы Scalaz Validation
:
def someApiCall : ValidationNEL[String, Result]
Преимущество здесь в том, что Validation
компонуется так, как Either нет (иначе они изоморфны типы).Например:
def a(i : Int) : ValidationNEL[String, Float]
def b(f : Float) : ValidationNEL[String, Boolean]
Тогда вы можете написать:
a(1) >>= b //ValidationNEL[String, Boolean]
Примерно так:
scala> def a(i : Int) : ValidationNEL[String, Float] = error("")
a: (i: Int)scalaz.Scalaz.ValidationNEL[String,Float]
scala> def b(f : Float) : ValidationNEL[String, Boolean] = error("")
b: (f: Float)scalaz.Scalaz.ValidationNEL[String,Boolean]
scala> lazy val c = a(1) >>= b
c: scalaz.Validation[scalaz.NonEmptyList[String],Boolean] = <lazy>