Scala 类型别名vs lambda类型

Scala 类型别名vs lambda类型,scala,scalaz,Scala,Scalaz,有人能解释一下这种方法的利弊吗 type VNel[+A] = ValidationNel[String, A] x.sequence[VNel, .... vs 据我所知,使用结构类型会导致必须使用反射的运行时性能下降 类型lambda是一种内联表示复杂类型的方法 类型别名是为类型创建标识符的方法。它可以是复杂类型,也可以像类型UserId=Int一样简单。当您开始多次需要复杂类型,或者希望通过将复杂签名分解为多个部分来简化它时,它非常有用 类型lambda和类型alias都不是结构类型。而

有人能解释一下这种方法的利弊吗

type VNel[+A] = ValidationNel[String, A]
x.sequence[VNel, ....
vs


据我所知,使用结构类型会导致必须使用反射的运行时性能下降

类型lambda是一种内联表示复杂类型的方法

类型别名是为类型创建标识符的方法。它可以是复杂类型,也可以像类型UserId=Int一样简单。当您开始多次需要复杂类型,或者希望通过将复杂签名分解为多个部分来简化它时,它非常有用

类型lambda和类型alias都不是结构类型。而是一种表达类型的方式

有关lambdas类型的更多详细信息:

它们基本上是等价的-使用你认为更清楚的。在我看来,类型别名通常更具可读性。在编写为扩展的trait或类的上下文中,lambda类型可以更清晰,因为它可以防止重写该类型,但这在很大程度上是一种边缘情况

在普通代码中访问在结构类型中定义的值确实会产生使用反射的成本。但在类型lambda中,结构类型仅用作泛型类型参数,该参数将在运行时删除。因此不会对运行时性能产生影响


如果您广泛使用类型LAMBDAS,您可能会考虑使用这种类型的投影机插件,它提供了更方便的语法,避免了与结构类型的视觉上类似的误导。

具体地,在lambda类型中使用结构类型没有运行时成本,与在运行时访问结构类型的成员时发生的情况不同。
x.sequence[({ type l[a] = ValidationNel[String, a] })#l, ....