加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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].
>将其声明为MaybeResult [Y](对于类型MaybeResult [A] = [Failure,A])

坦率地说,即便如此,我也会明确地宣布它. #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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读