Scala 为什么Tuple0-22和Function0-22而不是HList
元组不是HList,函数不是HList到某个值的映射,这有什么原因(性能、内存、类型系统)?性能和内存都有。元组对其元素具有Scala 为什么Tuple0-22和Function0-22而不是HList,scala,scala-collections,Scala,Scala Collections,元组不是HList,函数不是HList到某个值的映射,这有什么原因(性能、内存、类型系统)?性能和内存都有。元组对其元素具有O(1)访问权限;一般来说,HList是一个列表,因此具有O(n)。此外,元组需要为一个额外的对象提供内存,该对象引用了其他对象,而HList(作为列表)每个对象需要一个对象(加上一个next指针)。由于一个对象的开销大约是两个引用,因此这将n+2内存使用转化为4n+2。对于一个核心语言构造来说,这并不可怕。一个扩展AnyVal的类可能具有与TupleX类相当的性能和内存需
O(1)
访问权限;一般来说,HList
是一个列表,因此具有O(n)
。此外,元组需要为一个额外的对象提供内存,该对象引用了其他对象,而HList
(作为列表)每个对象需要一个对象(加上一个next
指针)。由于一个对象的开销大约是两个引用,因此这将n+2
内存使用转化为4n+2
。对于一个核心语言构造来说,这并不可怕。一个扩展AnyVal的类可能具有与TupleX类相当的性能和内存需求。唯一的开销是数组长度和数组索引边界检查。My(未提供信息)猜测:最初(在引入元组和函数类型时),typesystem的功能不足以构建HList;现在改变可能太晚了,否则一切都会很糟糕;就我个人而言,我真的很喜欢这种改变如果类型系统被修改为允许可变长度的类型列表,那么在Tuple
被专门化之前,这可能是正确的。关于专门化的好观点。不确定“可变长度类型列表”是什么意思。我想你不是指TList(当然是可变长度的)?好吧,我只是说它需要大量的返工。现在您必须手动指定HArray.apply
方法的类型和参数数量。如果我知道HArray存在,我会在问题中通过HArray替换HList+谢谢你提及此事。