Scala – 为紧凑性定义Either的类型,还是为了可读性而明确写入?
发布时间:2020-12-16 18:19:40 所属栏目:安全 来源:网络整理
导读:在 Scala中,我可以: trait Api { def someApiCall: Either[Failure,GoodResult];} 要么 object SomeObject { type SomeResult = Either[Failure,GoodResult]}trait Api { def someApiCall: SomeObject.SomeResult;} 前者对结果类型更明确,因此更容易阅读,但
在
Scala中,我可以:
trait Api { def someApiCall: Either[Failure,GoodResult]; } 要么 object SomeObject { type SomeResult = Either[Failure,GoodResult] } trait Api { def someApiCall: SomeObject.SomeResult; } 前者对结果类型更明确,因此更容易阅读,但涉及在不同的实现中反复重新输入.这在后者中得到了解决,但是后来读者无法对第一眼的结果作出很多结论. 如果返回类型是Option而不是Either,我自然会坚持使用前一版本.对于具有许多类型参数的更复杂类型,第二类更有益.要么是中场的某个地方. 我的直觉是,从长远来看,后者更易于维护.你怎么看?对此有实践吗? 解决方法
做其中一个
>将其明确声明为Either [X,Y]. 坦率地说,即便如此,我也会明确地宣布它. #2(超出您的建议)的优点是,使用标准的Failure类型(可能是Exception或List [String]),您不必为要使用它的任何地方声明单独的类型别名. 使用Either的优势在于,对于API用户来说,它是100%清晰的.但是,我会更进一步使用Scalaz的验证: def someApiCall : ValidationNEL[String,Result] 这里的优点是验证可以以不同的方式组合(否则它们是同构类型).例如: 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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |