的背景
我正在使用 Scala 开发一个事件库。在我的库中,您可以定义如下事件:
val e1 = new ImperativeEvent[Int]
你可以像这样触发它们:
e1(42)
您可以创建这样的反应:
val r1 = (i: Int) => println(i)
并将它们附加到这样的事件中:
e1 += r1
还有一些其他的东西(比如事件转换、组合等)。我使用Esper CEP 引擎作为库的后端。Esper 对大多数操作使用一种称为 EPL 的类似 SQL 的语言。
问题
我正在尝试实现一些更高级的概念,例如事件连接。所以现在你可以像这样定义具有多个属性的事件(使用元组类型):
val e2 = new ImperativeEvent[(Int, String)]
然后像这样加入他们:
val e3 = e1 join e2 windowLength (30) on "E1.P1 = E2.P1"
它在它们各自的第一个属性相等的条件下,对两者的最后 30 次出现执行 e1 和 e2 的连接。
这没关系,但我想摆脱实现中的字符串以使事件表达式类型可检查。我想将连接表达式更改为如下所示:
val e3 = e1 join e2 windowLength (30) on e1._1 === e2._1
类似于它在例如完成的方式。斯奎尔。问题是,我无法访问元组类型元素的类型......
问题
如何静态访问元组类型?现在我只能通过反射在运行时访问它们,这对我没有帮助。我很确定元组无法实现我想要实现的目标,但我想知道使用无形库中的 HLists 或类似的东西是否有助于实现我的目标。