【发布时间】:2015-10-07 12:42:51
【问题描述】:
昨晚我试图做一些关于接受和调用泛型函数的事情(即类型在调用站点是已知的,但可能因调用站点而异,因此定义应该是跨arities的通用函数)。
例如,假设我有一个函数f: (A, B, C, ...) => Z。 (其实fs这样的有很多,我事先不知道,所以无法确定A, B, C, ..., Z的类型和数量。)
我正在努力实现以下目标。
如何使用
(A, B, C, ...)的实例一般地调用f?如果事先知道f的签名,那么我可以做一些涉及Function.tupled f或类似的事情。如何定义与
f具有相同签名的另一个函数或方法(例如,某些object的apply方法)?也就是说,当且仅当f(a, b, c, ...)类型检查时,我如何定义g(a, b, c, ...)类型检查的g?为此,我正在研究 Shapeless 的HList。据我目前所知,HList至少解决了“表示任意数量的参数列表”问题,而且,Shapeless 将解决与元组之间的转换问题。但是,我仍然不确定我是否理解这将如何与泛型 arity 的函数相匹配,如果有的话。如何定义具有相关类型签名的另一个函数或方法到
f?现在想到的最大的例子是一些h: (A, B, C, ...) => SomeErrorThing[Z] \/ Z。
我记得前段时间看过一个关于 Shapeless 的会议演示。虽然演示者没有明确地展示这些东西,但他们所展示的东西(围绕抽象/泛化元组的各种技术 vs HLists)让我相信使用相同的工具可以实现与上述类似的事情。
提前致谢!
【问题讨论】:
-
我相信 Shapeless 会帮助你做到这一点。不幸的是,我现在没有时间摆弄这个。
-
我的印象也是,大致上,这类似于我看到的 Shapeless 所做的,但我不太确定如何。