我真正感兴趣的是找出差异在哪里,更一般地说,是确定不能使用 HList 的规范用例(或者更确切地说,与常规列表相比没有任何好处)。
(我知道 Scala 中有22个(我相信) TupleN
,而我们只需要一个 HList,但这不是我感兴趣的概念上的差异。)
我在下面的课文中标记了几个问题。回答这些问题实际上可能没有必要,它们更多的是指出我不清楚的东西,并指导讨论的某些方向。
我最近看到一些关于 SO 的答案,其中有人建议使用 HList (例如,由 没有形状提供) ,包括一个已删除的 这个问题答案。它产生了 这个讨论,从而引发了这个问题。
在我看来,hlist 只有在静态地知道元素的数量和它们的精确类型时才有用。这个数字实际上并不重要,但似乎不太可能需要生成一个包含不同但静态精确已知类型的元素的列表,但是您不可能静态地知道它们的数字。你能写出这样的例子吗? 例如,在一个循环中?我的直觉是,拥有一个静态精确的 hlist,其中包含静态未知数量的任意元素(相对于给定的类层次结构而言是任意的)是不兼容的。
如果这是真的,例如,您静态地知道数字和类型-问题2:,为什么不使用 n 元组?当然,你可以类型安全地映射和折叠一个 HList (你也可以,但是 没有类型安全地,在 productIterator
的帮助下做一个元组) ,但是因为元素的数量和类型是静态知道的,所以你可以直接访问元素的元素并执行操作。
另一方面,如果映射到 hlist 上的函数 f
非常通用,它可以接受所有元素-问题3:,为什么不通过 productIterator.map
使用它呢?好的,一个有趣的区别可能来自于方法重载: 如果我们有几个重载的 f
,那么 hlist 提供的更强的类型信息(与 productIterator 相反)可以允许编译器选择一个更具体的 f
。但是,我不确定这在 Scala 中是否真的可行,因为方法和函数是不一样的。
建立在同样的假设之上,也就是说,你需要静态地知道元素的数量和类型-问题4:可以在元素依赖于任何类型的用户交互的情况下使用 hlist 吗?例如,假设在一个循环中用元素填充一个 hlist; 从某个地方(UI、配置文件、参与者交互、网络)读取元素,直到满足某个条件。名单的类型是什么?类似于接口规范 getElements: HList [ ... ] ,它应该处理静态未知长度的列表,并允许系统中的组件 A 从组件 B 获取任意元素的列表。