类型别名VSλ型
问题描述:
任何人都可以解释的类型别名VSλ型
type VNel[+A] = ValidationNel[String, A]
x.sequence[VNel, ....
的优点/缺点VS
x.sequence[({ type l[a] = ValidationNel[String, a] })#l, ....
据我了解,使用结构类型招致不必使用反射的运行时性能损失。
答
类型lambda是一种内联表达复杂类型的方法。
类型别名是方式创建类型的标识符。它可以是一个复杂的类型或像type UserId = Int
一样简单。当您不止一次需要复杂类型时,或者您想通过分解部分来简化复杂签名时,它非常有用。
类型lambdas和类型别名都不是结构类型。而是一种表达类型的方式。
有关lambda表达式类型的详细信息: https://stackoverflow.com/a/8737611/547564
答
它们非常类似 - 无论使用哪你找到更清晰。海事组织的类型别名通常更具可读性。在写作要扩展的特征(或类)的上下文中,类型lambda可以更清晰,因为它可以防止重写类型,但这非常具有边缘情况。
在普通代码中访问结构类型中定义的值确实会产生使用反射的代价。但是在lambda类型中,结构类型仅用作泛型类型参数,它将在运行时擦除。所以不会有运行时性能的影响。
如果您正在广泛使用lambda类型,您可能会考虑使用类型投影机插件,它提供了更方便的语法(并避免了与结构类型误导的视觉相似性)。
具体而言,类型lambda中结构类型的使用没有运行时成本,与在运行时访问结构类型的成员时不同。 – mpilquist 2014-09-24 01:49:58