输入alias vs lambda type

时间:2014-09-23 22:29:02

标签: scala scalaz

任何人都可以解释

的优点/缺点
type VNel[+A] = ValidationNel[String, A]
x.sequence[VNel, ....

VS

x.sequence[({ type l[a] = ValidationNel[String, a] })#l, ....

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

2 个答案:

答案 0 :(得分:3)

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

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

lambdas和type别名都不是结构类型。而是表达类型的一种方式。

有关lambda类型的更多详细信息: https://stackoverflow.com/a/8737611/547564

答案 1 :(得分:1)

它们大多相当 - 使用你发现的更清楚的东西。 IMO类型别名通常更具可读性。在写入要扩展的特征(或类)的上下文中,类型lambda可以更清晰,因为它可以防止覆盖类型,但这是一个非常边缘的情况。

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

如果您正在广泛使用lambda类型,您可能会考虑使用kind-projector插件,它提供了更方便的语法(并避免了与结构类型的误导性视觉相似性)。